해결된 질문
작성
·
277
0
이번 예제에서 교수님께서 함수의 포인터 매개변수를 *arr이 아닌 arr[]로 하시는것을 보고 의구심이 생겨 이것저것 테스트트하고 저 나름대로의 결론을 내려보았습니다. 물론 전 코딩 초보자라 저의 추론이 틀릴수도 있기에 확실한 답을 얻고싶어 질문을 드립니다.
#include <stdio.h>
int* p(int p[])
{
return p;
}
int main()
{
int a = 5;
printf("%p %p", &a, p(&a));
return 0;
}
#include <stdio.h>
double average(double ptr[], double n)// 매개변수를 포인터로. 인수의 주소값을 지님. *ptr == ptr[]
{
double avg = 0.0;
for (int i = 0; i < n; ++i)
{
avg += ptr[i];// *ptr, ptr[] = 배열대입 -> 배열의 시작 주소값이 ptr에 대입.
printf("%d번째 주소와 값 : %p, %lf\n", i + 1, &ptr[i], ptr[i]);
//*(ptr + i) == ptr[i] : 배열 매개변수에 주소값을 대입시 그 주소값을 시작점으로 하는 배열이 선언 ?
}
avg /= n;
return avg;
}
int main()
{
double arr1[5] = { 10,13,12,7,8 };
printf("arr1의 주소와 값\n");
for (int i=0;i<5;++i)
printf("%d번째 주소와 값 : %p, %lf\n", i + 1, &arr1[i], arr1[i]);
double arr2[3] = { 1.8,-0.2,6.3 };
printf("\narr2의 주소와 값\n");
for (int i = 0; i < 3; ++i)
printf("%d번째 주소와 값 : %p, %lf\n", i + 1, &arr2[i], arr2[i]);
printf("\n\narr1 함수대입.\n");
printf("arr1의 평균 : %lf\n\n", average(arr1, 5));// 특정 요소가 지정되지 않은 배열은 포인터에 대입시 &를 쓰지않음.
printf("arr2 함수대입.\n");
printf("arr2의 평균 : %lf\n\n", average(arr2, 3));
return 0;
}
테스트해본 결과 배열을 인수로 할때뿐만 아니라 변수의 주소값을 매개변수에 대입할때도 *arr대신 arr[]을 매개변수로 사용하는것에 차이나 오류가 없었습니다. 그렇다고 해서 포인터 선언으로 int arr[] = &a; 가 되는건 또 아니였습니다.
제 생각엔 배열A를 매개변수로, 주소값을 인수로 대입하면 그 주소값을 시작점으로 삼는 배열A가 선언되는것 같았습니다. 배열B을 인수로 대입할땐 A나 B나 시작 주소값이 같기에 A[n] == *(A + n) == B[n](n은 자연수) 인 것이고 변수C의 주소값를 인수로 대입할땐 배열 자체가 주소값을 표현하기에(("%p", A) == ("%p", &C)) 별 문제가 없는것이 아닐까 생각하고 있습니다.
제 생각에 어떤 오류가 있나요? 오류가 있다면 올바른 답은 무엇인가요? 답변을 부탁드립니다.
그럼 포인터* 와 곱셈*가 모습만 같지 기능은 다른것처럼 배열형 매개변수는 모습만 배열이고 포인터다 라고 생각하면 되겠습니까?