1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <stdio.h> void reversePrint(int arr[]) { int *p; int i; int size; p = arr; printf("sizeof(arr) == %d \n", sizeof(arr) ); printf("sizeof(p) == %d \n", sizeof(p) ); size = sizeof(arr) / sizeof(arr[0]); printf("### size = %d ### \n", size); } int main(void){ int arr[7] = {-10, 0, 10,20,30,40,50}; int i, size; size = sizeof(arr) / sizeof(arr[0]); printf("### size = %d ### \n", size); reversePrint(arr); return 0; } | cs |
출력결과
### size = 7 ###
sizeof(arr) == 4
sizeof(p) == 4
### size = 1 ###
계속하려면 아무 키나 누르십시오 . . .
어... main에서
size = sizeof(arr) / sizeof(arr[0]);
를 쓰면 size == 7인데
reversePrint( int arr[]) 에 인자로 넣어서
size = sizeof(arr) / sizeof(arr[0]);
를 쓰니까 size == 1이 되네요
함수에 인자로 갈 때 &arr[0] 가 전달되서 그런 거 같은데
질문 : 그럼 main에서 쓰는 arr은 &arr[0]가 아닌 무언가 인가요? 왜 main에서 sizeof(arr)은 4*7이죠?
확실히 main에서 쓰여진 arr은 주소값이 아닌 것 같은데, 주소값은 무조건 int니까 sizeof(주소값)은 4가 되어야 하잖아요
그럼 저건 뭐죠>?
참고로, 포인터 상수는 배열에 대한 좋은 이해 방식이 아니다. 실제 적용되는 규칙은 다음과 같다. "sizeof 연산자의 피연산자(sizeof(arr))이거나, 단항 & 연산자의 피연산자(배열의 주소값을 얻을 때. &arr;)이거나, 배열 초기화 시에 사용된 문자열 상수(char s[]="text"; 와 같은 경우. 문자열 상수도 배열이기 때문에, 이런 예외규칙이 필요하다.)인 경우를 제외하고는, 배열 타입을 갖는 수식은 포인터 타입의 수식으로 변환되며, 그 값은 배열의 첫번째 원소를 가리키고, lvalue가 될 수 없다." 라는 글을 봤는데요
그러니까... 함수의 인자로 들어갈 때는 &arr;[0]로 들어가는 거 아닌가요?
아 컴파일 타임에 결정되니까 그냥 그런 거신가....
그렇군요 감사합니다.
함수의 인자로는 스칼라만 취급 가능. 배열은 스칼라만 취급 가능한 문맥에선 첫 원소의 포인터로 자동으로 바뀌어서 처리됨.
하지만 변수로 선언된 배열이나 문자열 상수(string literal)는 배열로 처리된다. 스칼라로 취급할 때만 첫 원소에 대한 포인터가 될 뿐이야.
가령 sizeof "hello"는 6임.