int arr[72], *ptr;
(1) int arr[72]를 선언하면 무슨 일이 생기는가?
int 72칸을 저장할 수 있는 배열이 생긴다.
(2) 배열 이름은 그 배열의 첫 번째 요소를 가리키는 포인터라던데, 그렇다면 그 포인터를 위해서도 따로 공간이 할당되는가?
그렇지 않다. 다른 상수 값과 비슷하다고 생각하면 된다.
예를 들면 int n = 93 * 101;을 한다고 해서 93과 101을 위한 메모리 공간이 따로 할당되지는 않는다.
(3) 배열 이름이 포인터라면, 위의 arr과 ptr의 자료형은 같은 것인가?
배열 이름과 포인터는 다르다. 다만 배열 이름이 몇몇 상황에서 포인터로 암시적인 형 변환(implicit type conversion)을 겪을 뿐이다.
이러한 변환을 붕괴(decay)라고 한다.
(4) 붕괴는 언제 일어나는가?
배열 이름 자체에 sizeof를 씌우거나, 배열 이름 앞에 & 연산자를 붙여 주소를 취할 때는 붕괴가 일어나지 않는다.
웬만한 경우에는 붕괴가 일어난다.
(5) 배열 이름 앞에 &를 붙인 것은 무엇인가?
int n;을 하고 &n을 하면 int에 대한 포인터 (int *)가 나오듯이,
int arr[72];를 하고 &arr을 하면 int [72]에 대한 포인터 (int (*)[72])가 나온다.
이것은 고차원 배열의 요소의 포인터와 같다.
예를 들면 int arr2[9393][72];은 int [72]가 9393개 모인 배열이므로 각각의 포인터의 자료형은 int (*)[72]가 된다.
또한, arr2라고 배열 이름을 사용하면 이것이 붕괴될 때 int (*)[72]로 붕괴된다.
(6) 자료형 (*)[크기]와 같은 문법은 처음 보는데?
기억을 잘 떠올려 보면 2차원 또는 그 이상의 고차원 배열을 함수에 넘겨주는 법을 배울 때 분명히 같이 배웠을 것이다.
이것은 고차원 배열의 이름이 배열을 가리키는 포인터로 붕괴하기 때문이다.
(7) scanf에서 배열 이름 앞에 &를 붙여도 상관이 없었던 이유는?
어차피 scanf는 가변 개수의 인자를 받는 함수라서 자료형 검사가 이루어지지 않고,
시작하는 주소만 같으면 포인터의 값은 변하지 않기 때문이다. 하지만 그런 식으로 사용하는 것은 바람직하지 않다.
char str[72];
scanf("%s", &str); // char *를 넘겨줘야 하는 자리에 char (*)[72]를 넘겨주었다!
printf("%s\n", str);
위와 같이 쓰는 것은 의미상 아래와 비슷하다.
char arr[1][72];
scanf("%s", arr); // char *를 넘겨줘야 하는 자리에 char (*)[72]를 넘겨주었다!
printf("%s\n", arr[0]);
물론 scanf가 아닌 평범한, 함수 원형(prototype)을 통해 자료형 검사가 이루어지는 함수에 이런 짓을 하면 오류가 뜬다.
(8) char *과 char (*)[72]의 동작의 차이는?
1을 더하면 char *는 1바이트 이동하고 char (*)[72]는 72바이트 이동한다.
당연한 거 아냐?
― 끝 ―
귀여운 치하야짤 보고 가라
스님 멋쟁이~ 근데 초보들은 1/3쯤 못알아들을듯
그리고 타입 중심의 설명이라 값 중심의 설명은 좀 보강해 주심이~
아 안사요
누가 비추 누르냐? 양심도 없는것들
고차원배열 헷갈리는데 다시 봐야겠다
나는 개추누름헤헤
이 사람은 TCPL이나 그에 준하는 자료를 보았다
C언어는 TCPL이라는 교과서수준의 책이 있으니 꼭보자 두번보자 세번보자
개추를 눌렀읍니다
이거 경력자들도 잘 모르는 경우 허다하다....ㅋㅋㅋ 2차원 배열은 2중 포인터로 받는거라고 부사수한테 갈켜주는 병신들도있음