작성
·
489
0
현재 챕터 10까지 다봤는데도 포인터가 잘 이해가 안되서 9강 터 다시 복습중입니다.
이번 강의에서 교수님이 설명해주시는 부분은 이해가 가는데요.
강의 19분 31초경에 29번째 줄의 코드를
printf("Avg = %f\n", average(&arr1, 5)); 처럼 쓰면 왜 differs in levels of indirection warning이 뜨는지 잘 이해가 안됩니다. (코드실행은 또 정상적으로 됩니다.....)
본강의의 main 함수에서 printf("%p %p %p", arr1, &arr1, &arr1[0]); 를 실행시켜보면 arr1, &arr1, &arr1[0] 전부다 같은 메모리 주소값을 가지고 있는것을 알 수 있습니다.
그렇다면 함수의 인자로 저 세가지값중 어떤걸 넘겨줘도 상관이 없는거 아닌가요???? 왜 arr1 과 &arr1[0] 은 문제가 없는데 &arr1은 warning이 뜨는걸까요...
답변 5
2
감사합니다 아직 혼란스럽지만 그래도 덕분에 어느정도 정리가 된것 같아요....
구글로도 조금더 검색해봤는데 이하의 링크들에 나온 답변들도 이해하는데 도움이 되었습니다. 혹시 저와 같은 의문을 가지신 분이 있을거 같아 링크를 남겨 둡니다.
https://stackoverflow.com/questions/1641957/is-an-array-name-a-pointer
https://www.geeksforgeeks.org/whats-difference-between-array-and-array-for-int-array5/
1
1. 이건 제가 잘못 쓴 것입니다! 워낙 int 가 익숙하다보니 잘 못 썼네요 ㅠㅠ double이 맞습니다. 죄송합니다.
2. 그렇...지 않을까요? 저도 정확히는 모르겠습니다만 교수님께서도 설명해주셨고 C언어 책에도 있는 내용이라 아마 그럴 것 같습니다.
1
안녕하세요.
&arr1 과 arr1 이 "같은 값"을 가지고 있는 것은 맞습니다만 이 둘은 타입이 서로 다릅니다.
&arr1 은 길이가 5인 배열을 참조하는 double[5] 포인터이고 (arr1의 주소! 라고 직관적으로 생각해보시면 됩니다) arr1 은 배열의 첫 번째 double원소를 참조하는 double포인터에요.
average 함수의 매개변수 arr1은 double arr1[] 즉 double * 타입의 파라미터 만을 받을 수 있는 매개변수라고 선언했기 때문에 (double[5] *)의 포인터인 &arr1 을 인수로 넘길 수 없는 것입니다. 매개 변수와 타입이 일치하지 않기 때문입니다.
void Func(float a) 인 함수에 같은 값이더라도 float f = 3.0f 은 파라미터로 a에 넘길 수 있겠지만 int n = 3 은 넘길 수 없는 것과 같은 이치입니다. (사실 자동 형변환으로 인하여 이 경우는 불가능하지 않고 가능 합니다만 이해를 돕기 위해 안된다고 가정을 하고 한번 예시를 들어 보았습니다.)
0
0
안녕하세요 답변 해주셔서 감사드립니다. 답변내용을 바탕으로 워닝 창의 'function': 'double *' differs in levels of indirection from 'double (*)[5]' 경고문을 다시 생각해보니 해당 경고문이 의미 하는 것은 답변주신것처럼 double원소 5개의 배열을 가리키는 포인터와 그냥 double 원소 1개를 가리키는 포인터가 indirection의 수준이 다르다는 것인거네요.
말씀해주신대로 타입이 달라져서 그런가 보다라고 생각해보면 납득이 되는것같아요. 그런데 답변 주신 것에서 추가로 궁금한 점이 두 가지 있습니다.
1. 주신답변에서 "arr1 은 배열의 첫 번째 double원소를 참조하는 int 포인터에요." 라고 말씀해주신 부분이 있는데요....
arr1은 double을 담는 array로 선언이되었으니 저는 그냥 arr1은 당연히 형에 맞추어 double 포인터일거라고 생각했는데 int 포인터인건가요?
2. &(어드레스 오퍼레이터)를 배열이름앞에 쓰면 전체 배열의 크기를 가리키는 포인터가 된다는 문법규칙이 C99에 원래 정해져 있는건가요?