반응형

char형 배열의 선언

배열의 시작 주소 carr와 첫 번째 변수 carr[0]에

'&' 주소 연산자가 붙으면 배열의 시작 주소와 같다.

 

 

 

int형 배열의 선언

iarr은 배열의 시작 주소이고 배열의 첫 번째 변수 iarr[0]에

'&' 주소 연산자를 붙이면 배열의 시작 주소와 같다.

 

 

 

 

char형과 int형 배열의 크기 출력

sizeof() 연산자를 사용하여서 배열의 크기를 구할 수 있다.

 

 

 

char형 배열 요소에 접근

carr형 데이터를 저장하고 있는 char형 1차원 주소로 사용된다.

 

 

 

'*' 연산자를 사용하여 메모리에 접근

carr[0]과 *carr, carr[1]과 *(carr+1)는 동일하다.

 

 

 

'*'과 '&' 연산자를 사용하여 char형 배열 요소에 접근

&carr[0] 또한 1차원 char형 주소이므로

*&carr[0]은 carr[0]인 메모리 자체(값)가 된다.

 

 

 

char형 배열 주소에 정수를 가산

carr은 char형 1차원 주소이므로

+1을 한 것은 주소 1개를 증가시킨다.

 

 

 

상수 주소를 사용하여 배열 요소에 접근

(carr이 0xbefb28의 주소를 사용한다는 가정)

형변환 연산자를 사용하여 상수를 chat형 주소로 변환한 후

'*' 연산자를 사용하여 char형 1byte에 접근한다.

 

 

 

int형 배열 요소의 출력

iarr은 int형 1차원 주소이므로 +1을 할 때마다 4개 주소씩 건너뛰고,

'*' 연산자를 사용하여 메모리 자체(값)를 접근할 수 있다.

 

 

 

int형 배열 주소에 정수를 가산

iarr은 배열의 시작 주소이고 int형 1차원 주소이므로

4byte 씩 증가한 주소가 출력된다.

 

 

 

상수 주소를 사용하여 배열 요소에 접근

iarr의 시작 주소가 0x134fe34라면 형변환 연산자를 사용하여

상수를 int형 주소로 변환한 후 '*' 연산자를 사용하여 int형 4byte에 접근한다.

 

 

 

char형 1차원 배열과 2차원 배열의 비교

carr1은 1차원 배열의 시작 주소라 하고 carr2는 2차원 배열의 시작 주소라 한다.

carr1 배열의 첫 번째 배열 요소는 carr1[0]과 같이 접근하지만

carr2 배열의 첫 번째 배열 요소는 carr1[0][0]와 같이 접근한다.

 

 

 

int형 1차원 배열과 2차원 배열의 비교

int iarr1[9]는 int형 메모리가 9개이므로 총 36byte (9*4byte)이고,

int iarr2[3][3]도 int형 메모리가 9개이므로 총 36byte (3*3*4byte)이다.

 

 

 

char형 1차원 배열과 2차원 배열의 크기 출력

sizeof()를 사용하면 배열의 크기를 구할 수 있다.

 

 

 

int형 1차원 배열과 2차원 배열의 크기 출력

iarr1은 1차원 int형 배열의 시작 주소이고,

iarr2는 2차원 int형 배열(3*3)의 시작 주소이다.

iarr2[0]는 2차원 배열의 0행의 대표 주소이고,

iarr2[1]은 2차원 배열의 1챙의 대표 주소이다.

 

 

 

char형 2차원 배열의 주소 출력

carr2는 2차원 char형 배열의 시작 주소로 f449a0이고

carr2[0]는 0행의 시작 주소 f449a0이고,

carr2[1]는 1행의 시작주소 f449a3이다.

또 &carr2[0][0]은 char형 메모리 1차원 시작 주소로 f449a0이고,

&carr2[1][0]는 char형 메모리의 1차원 시작 주소로 f449a3이다.

 

 

 

int형 2차원 배열의 주소 출력

iarr2는 2차원 int형 배열의 시작 주소로 f3fa34이고,

iarr2[0]는 0행의 시작 주소 f3fa34이고,

iarr2[1]는 1행의 시작 주소 f3fa40이다.

또 iarr2[2]는 2행의 시작 주소 f3fa4c이다.

 

 

 

char형 2차원 배열의 주소 출력

carr2는 char형 2차원 배열의 시작 주소 8ffa64이고

&carr2[0][0]는 char형 1byte 메모리의

1차원 시작 주소인 8ffa64라는 것을 알 수 있다.

carr2[0]은 0행의 시작 주소 8ffa64이고

carr2[1]은 1행의 시작주소 8ffa66이다.

 

 

 

char형 2차원 배열 주소의 가산

&carr2[0][0]는 char형 1byte 주소를 의미하며

여기에 +1을 한 것은 1byte 주소를 가산하라는 의미다.

char2는 char형 배열 2*2의 시작 주소를 의미하며

+1을 한 것은 열의 byte 수인 2byte (char형 2개[2])의 주소를 건너뛰라는 의미이다.

carr2[0]는 0행의 시작 주소를 의미하며 1차원 char형 주소의 의미로

+1을 한 것은 char형 1byte 주소를 건너뛰라는 의미이다.

또 carr2는 char형 2차원 배열이므로 char형의 2차원 의미를 갖고

carr2[0], carr2[1], carr[0][0]는 1차원 의미를 갖는다.

 

각 주소는 '*' 연산자를 붙여 값에 접근하거나 차원을 한 단계 낮추는데 사용한다.

예를 들어 1차원 주소에 '*' 연산자를 붙이면 값이 되지만

2차원 주소에 '*' 연산자를 붙이면 1차원 주소가 되고,

3차원 주소에 '*' 연산자를 붙이면 2차원 주소가 된다.

 

 

 

char형 2차원 배열 이름을 사용하여 첫 번째 배열 요소에 접근

carr2는 2차원 주소 a0fdc4를,

*carr2는 1차원 주소 a0fdc4를,

**carr2는 메모리 자체 (문자 'A')를 의미한다.

 

 

 

char형 2차원 배열 이름을 이용하여 값에 접근 (1)

carr2 + 1은 carr2에 2byte 증가한 2차원 주소를 의미하며,

*(carr2 + 1)은 2차원 주소에 '*' 를 붙여 1차원 부소를 의미한다.

다시 *(carr2 + 1)에 '*' 를 하나 더 붙인 **(carr2 + 1)은 메모리 자체 (문자 'C')를 의미한다.

 

 

 

char형 2차원 배열 이름을 사용하여 값에 접근 (2)

carr2에 +2를 하면 2byte를 두 번 건너 뛰어서 4byte가 증가한다.

그래서 주소는 a0fdc8이되며 2차원 주소를 의미한다.

또 *(carr + 2)는 1차원 주소 a0fdc8을 의미하며,

**(carr2 + 2)는 a0fdc8의 메모리 자체(쓰레기값)를 의미한다.

 

 

 

char형 2차원 배열 이름을 사용하여 값에 접근 (3)

carr2는 2차원 주소의 의미이고,

*carr2는 1차줜 주소의 의미이므로,

**carr2는 값 'A' 문자이다.

carr2 + 1은 2차원 주소의 의미이고,

*(carr2 + 1)는 1차원 주소의 의미이므로

**(carr2 + 1)는 값 'C' 문자이다.

 

 

 

char형 3차원 배열 이름을 사용하여 값에 접근

carr3는 3차원 char형 배열의 시작 주소이다.

+1은 행*열([2][3], 6byte)을 증가시킨 주소 53fed6이 된다.

carr3[0]에 +1을 한 것은 열([3], 3byte)을 증가시킨 주소 53fed3이 된다.

carr3[0][0]에 +1을 한 것은 char형 1byte를 증가시킨 53fed1이 된다.

carr3[0][0][0]는 문자 'A'(0x41)에 1을 증가시켜 'B'(0x42)가 된다.

 

 

 

int형 2차원 배열의 주소 출력

배열의 시작 주소 iarr2는 8ffb58이고,

iarr2[0]는 1차원 주소의 의미로 8ffb58이고

iarr2[1]은 1차원 주소의 의미로 8ffb60이다.

 

 

 

int형 3차원 배열의 주소 출력

iarr3, iarr3[0], iarr3[0][0], &iarr3[0][0][0]의 주소는 모두 90f864로 같은 주소를 출력한다.

iarr3은 배열의 3차원 주소를 의미하고,

iarr3[0]은 배열의 2차원 주소를 의미하고,

irarr3[0][0]은 배열의 1차원 주소를 의미하고,

&iarr3[0][0][0]은 char형 변수 1차원 주소의 의미이다.

 

 

 

'*' 연산자를 사용하여 int형 배열 요소에 접근

배열의 시작 주소 iarr은 int형 1차원 주소의 의미이므로,

iarr이 12ff68라면 iarr+1은 12ff6c이고, iarr+5는 12ff7c이다.

iarr[0]은 *(iarr+0)이고, iarr[1]은 *(iarr+1)이고 iarr[5]은 *(iarr+5)이다.

 

 

 

[ ] 연산자를 이용하여 int형 배열 요소에 접근 (1)

&iarr[2]는 int형 1차원 주소이고 &iarr[2]를 중심으로 +, - 연산을 하여 메모리에 접근할 수 있다.

 

 

 

[ ] 연산자를 이용하여 int형 배열 요소에 접근 (2)

iarr2는 int형 배열의 2차원 시작 주소이고

iarr2[0]는 배열의 1차원 시작 주소이므로

이곳에 1씩을 가산하여 다음 배열 요소(메모리)에 접근할 수 있다.

iarr2[1]도 배열의 1자원 주소이므로

정수를 가·감산하여 주소를 이동하고 배열 요소에 접근한다.

iarr2[0]는 int형 1차원 주소 12ff68이므로 iarr2[0][3](*(iarr[0]+3))은

iarr2[0]에 +3을 한 주소 12ff74의 실제 값 40이다.

iarr2[1][-3]은 iarr2[1]에 -3을 한 주소 12ff68의 실제 값 10이다.

 

 

 

int형 2차원 배열의 주소 출력 (1)

iarr2는 2차원 배열의 시작 주소로 2차원의 의미이며,

나머지 출력되는 모든 주소의 의미는 1차원 주소이다.

 

 

 

int형 2차원 배열의 주소 출력 (2)

iarr2는 int형 2차원 배열 주소의 의미이고,

iarr2[0]과 iarr2[1]은 int형 1차원 주소의 의미이다.

 

 

 

상수를 사용하여 2차원 배열의 값 출력

 

반응형

 

3장 내용정리

  • 배열은 같은 자료형의 연속적인 메모리 공간(같은 자료형 변수들의 집합)이다.
  • 배열의 이름은 그 배열이 시작하는 메모리 공간의 시작 주소이다.
  • int arr[n]의 배열은 n개의 int형 메모리가 만들어지면, arr[0]~arr[n-1]의 메모리 공간(변수)을 사용할 수 있다.
  • 1차원 배열의 이름은 1차원 주소의 의미를 갖고, 2차원 배열의 이름은 2차원 주소의 의미를 갖는다.
  • 1차원 배열의 이름에는 * 연산자를 한 번 붙이면 값이 되고, 2차원 배열의 이름에는 * 연산자를 두 번 붙여야 값이 된다.
  • n차원 배열의 이름은 n차원 주소의 의미이므로 * 연산자를 n번 붙여야 값에 접근할 수 있다.

 

 

 

연습문제 (1)

 

 

 

연습문제 (2)

 

 

 

연습문제 (3)

 

 

 

연습문제 (4)

 

 

 

연습문제 (5)

 

 

 

연습문제 (6)

 

 

반응형

'cs > c-pointer' 카테고리의 다른 글

[열혈강의] 02. 포인터  (0) 2022.01.06
[열혈강의] 01. 변수와 메모리  (0) 2022.01.06

+ Recent posts