인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

KoKo님의 프로필 이미지
KoKo

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.7 배열을 함수에게 전달해주는 방법

배열형태를 지닌 포인터 매개변수에 대한 질문입니다.

해결된 질문

작성

·

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)) 별 문제가 없는것이 아닐까 생각하고 있습니다.

제 생각에 어떤 오류가 있나요? 오류가 있다면 올바른 답은 무엇인가요? 답변을 부탁드립니다.

답변 1

1

안녕하세요~!

둘이 차이 없고 같은 것 맞습니다. 

정확히 어떤 강의에서 나왔던건지는 기억이 안나지만

매개변수가 int arr [] 이런식이면 사실상 포인터나 마찬가지라고 강의에서 가르쳐 주십니다. 

포인터와 똑같이 동작하는데 배열을 파라미터로 넘길거다라는 약간 '가독성 측면'에서 저런 문법이 가능한거라고 알고 있어요.

매개변수가 int arr [] 더라도 사실상 arr 은 배열이 아닌 포인터로 동작합니다. (즉, 배열처럼 보여도 사실 arr은 int * 인거에요)

KoKo님의 프로필 이미지
KoKo
질문자

그럼 포인터* 와 곱셈*가 모습만 같지 기능은 다른것처럼 배열형 매개변수는 모습만 배열이고 포인터다 라고 생각하면 되겠습니까?

네 맞습니다.

KoKo님의 프로필 이미지
KoKo
질문자

옙 잘 알려주셔서 감사합니다.

KoKo님의 프로필 이미지
KoKo

작성한 질문수

질문하기