배열의 시작 주소 carr와 첫 번째 변수 carr[0]에
'&' 주소 연산자가 붙으면 배열의 시작 주소와 같다.
iarr은 배열의 시작 주소이고 배열의 첫 번째 변수 iarr[0]에
'&' 주소 연산자를 붙이면 배열의 시작 주소와 같다.
sizeof() 연산자를 사용하여서 배열의 크기를 구할 수 있다.
carr형 데이터를 저장하고 있는 char형 1차원 주소로 사용된다.
carr[0]과 *carr, carr[1]과 *(carr+1)는 동일하다.
&carr[0] 또한 1차원 char형 주소이므로
*&carr[0]은 carr[0]인 메모리 자체(값)가 된다.
carr은 char형 1차원 주소이므로
+1을 한 것은 주소 1개를 증가시킨다.
(carr이 0xbefb28의 주소를 사용한다는 가정)
형변환 연산자를 사용하여 상수를 chat형 주소로 변환한 후
'*' 연산자를 사용하여 char형 1byte에 접근한다.
iarr은 int형 1차원 주소이므로 +1을 할 때마다 4개 주소씩 건너뛰고,
'*' 연산자를 사용하여 메모리 자체(값)를 접근할 수 있다.
iarr은 배열의 시작 주소이고 int형 1차원 주소이므로
4byte 씩 증가한 주소가 출력된다.
iarr의 시작 주소가 0x134fe34라면 형변환 연산자를 사용하여
상수를 int형 주소로 변환한 후 '*' 연산자를 사용하여 int형 4byte에 접근한다.
carr1은 1차원 배열의 시작 주소라 하고 carr2는 2차원 배열의 시작 주소라 한다.
carr1 배열의 첫 번째 배열 요소는 carr1[0]과 같이 접근하지만
carr2 배열의 첫 번째 배열 요소는 carr1[0][0]와 같이 접근한다.
int iarr1[9]는 int형 메모리가 9개이므로 총 36byte (9*4byte)이고,
int iarr2[3][3]도 int형 메모리가 9개이므로 총 36byte (3*3*4byte)이다.
sizeof()를 사용하면 배열의 크기를 구할 수 있다.
iarr1은 1차원 int형 배열의 시작 주소이고,
iarr2는 2차원 int형 배열(3*3)의 시작 주소이다.
iarr2[0]는 2차원 배열의 0행의 대표 주소이고,
iarr2[1]은 2차원 배열의 1챙의 대표 주소이다.
carr2는 2차원 char형 배열의 시작 주소로 f449a0이고
carr2[0]는 0행의 시작 주소 f449a0이고,
carr2[1]는 1행의 시작주소 f449a3이다.
또 &carr2[0][0]은 char형 메모리 1차원 시작 주소로 f449a0이고,
&carr2[1][0]는 char형 메모리의 1차원 시작 주소로 f449a3이다.
iarr2는 2차원 int형 배열의 시작 주소로 f3fa34이고,
iarr2[0]는 0행의 시작 주소 f3fa34이고,
iarr2[1]는 1행의 시작 주소 f3fa40이다.
또 iarr2[2]는 2행의 시작 주소 f3fa4c이다.
carr2는 char형 2차원 배열의 시작 주소 8ffa64이고
&carr2[0][0]는 char형 1byte 메모리의
1차원 시작 주소인 8ffa64라는 것을 알 수 있다.
carr2[0]은 0행의 시작 주소 8ffa64이고
carr2[1]은 1행의 시작주소 8ffa66이다.
&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차원 주소가 된다.
carr2는 2차원 주소 a0fdc4를,
*carr2는 1차원 주소 a0fdc4를,
**carr2는 메모리 자체 (문자 'A')를 의미한다.
carr2 + 1은 carr2에 2byte 증가한 2차원 주소를 의미하며,
*(carr2 + 1)은 2차원 주소에 '*' 를 붙여 1차원 부소를 의미한다.
다시 *(carr2 + 1)에 '*' 를 하나 더 붙인 **(carr2 + 1)은 메모리 자체 (문자 'C')를 의미한다.
carr2에 +2를 하면 2byte를 두 번 건너 뛰어서 4byte가 증가한다.
그래서 주소는 a0fdc8이되며 2차원 주소를 의미한다.
또 *(carr + 2)는 1차원 주소 a0fdc8을 의미하며,
**(carr2 + 2)는 a0fdc8의 메모리 자체(쓰레기값)를 의미한다.
carr2는 2차원 주소의 의미이고,
*carr2는 1차줜 주소의 의미이므로,
**carr2는 값 'A' 문자이다.
carr2 + 1은 2차원 주소의 의미이고,
*(carr2 + 1)는 1차원 주소의 의미이므로
**(carr2 + 1)는 값 'C' 문자이다.
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)가 된다.
배열의 시작 주소 iarr2는 8ffb58이고,
iarr2[0]는 1차원 주소의 의미로 8ffb58이고
iarr2[1]은 1차원 주소의 의미로 8ffb60이다.
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차원 주소의 의미이다.
배열의 시작 주소 iarr은 int형 1차원 주소의 의미이므로,
iarr이 12ff68라면 iarr+1은 12ff6c이고, iarr+5는 12ff7c이다.
iarr[0]은 *(iarr+0)이고, iarr[1]은 *(iarr+1)이고 iarr[5]은 *(iarr+5)이다.
&iarr[2]는 int형 1차원 주소이고 &iarr[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이다.
iarr2는 2차원 배열의 시작 주소로 2차원의 의미이며,
나머지 출력되는 모든 주소의 의미는 1차원 주소이다.
iarr2는 int형 2차원 배열 주소의 의미이고,
iarr2[0]과 iarr2[1]은 int형 1차원 주소의 의미이다.
3장 내용정리
- 배열은 같은 자료형의 연속적인 메모리 공간(같은 자료형 변수들의 집합)이다.
- 배열의 이름은 그 배열이 시작하는 메모리 공간의 시작 주소이다.
- int arr[n]의 배열은 n개의 int형 메모리가 만들어지면, arr[0]~arr[n-1]의 메모리 공간(변수)을 사용할 수 있다.
- 1차원 배열의 이름은 1차원 주소의 의미를 갖고, 2차원 배열의 이름은 2차원 주소의 의미를 갖는다.
- 1차원 배열의 이름에는 * 연산자를 한 번 붙이면 값이 되고, 2차원 배열의 이름에는 * 연산자를 두 번 붙여야 값이 된다.
- n차원 배열의 이름은 n차원 주소의 의미이므로 * 연산자를 n번 붙여야 값에 접근할 수 있다.
'cs > c-pointer' 카테고리의 다른 글
[열혈강의] 02. 포인터 (0) | 2022.01.06 |
---|---|
[열혈강의] 01. 변수와 메모리 (0) | 2022.01.06 |