카테고리 없음

정적 배열의 포인터 리턴하는 함수

ksyoon 2014. 9. 1. 11:03

정적 배열의 포인터를 리턴 하는 함수는 만들 때  

 

 

int * func(int x)
{
   static int a[4] = {10,20,30,40};
 
  /* x는 사용하지 않았고 그냥 배열 a를 넘깁니다 */
 
   return a;
}

간단히 배열의 이름을 리턴 하려고 하면 컴파일 에러가 발생된다.

int a[3][4] 배열을 넘기는 포인터는 int ** 라고 생각하기 쉬운데 그렇지 않습니다.
정확히 말하면 int (*p)[4] 가 정확한 등가포인터입니다.
그런데 이러한 타입을 넘기는 함수는 매우 복잡해 집니다.
 

int (*func(int x))[4] 이다.

 

아래가 그 예제이다. 

 

 

int  (* func(int x))[4]
{
   static int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
 
  /* x는 사용하지 않았고 그냥 배열 a를 넘깁니다 */
 
   return a;
}
 
void main(void)
{
   int (*p)[4];   
   p = func(1);
 
   printf("%d %d %d %d\n", p[0][0], p[1][1], p[2][2], p[2][3]);

}

복잡하죠?

 

잘 보면 이해가 된다. func(int x) 가 리턴하는 포인터 즉 p = func(int x)라고 보면

int (* p)[4] 가 된다.

즉 함수가 리턴하는 포인터는 크기가 4인 정수형 배열 포인터(ponter to array) 인 것이다.


참고 http://skyofsea.egloos.com/viewer/1948440 에서 일부 내용 참고함.