이중 포인터 개념 정리

카테고리 없음 2014. 2. 13. 23:32

int arr[2][3]; 로 int형 배열이 선언되어 있을때 원소의 개수는 몇개 일까요?

6개 같지만 2개입니다. 2차원 배열처럼 보이지만 실제 메모리는 1차원 이므로 2차원 배열이 아니라

1차원 배열의 확장입니다.

 

배열의 포인터는 int (*pArr)[3] = arr; 로 표현이 가능합니다.

 ☞ int *pArr[3]으로 작성하면 컴파일러는 int형 포인터를 리턴하고 변수가 배열인 함수로 해석합니다.(괄호 필수)

 

2차원 동적 배열을 선언할때 대부분

int **myArr = (int**)calloc(2, sizeof(int*));

for(int i=0; i<3; i++)

    myArr[i] = (int*)calloc(3, sizeof(int));

으로 선언하고 사용합니다. 이때 선언시 2차원 포인터를 사용해서 2차원 배열은 2차원 포인터를 사용하는것으로

생각하기 쉽습니다.

하지만 이차원 포인터로 생각하는 이유는 참조의 참조 2번의 참조를 거치기 때문에 사용하는것이지,

꼭 2차원 배열을 동적할당할 때에는 2차원 포인터를 사용하지 않아도 됩니다.

☞  int (*myArr)[3] = (int(*)[3])malloc(sizeof(int)*2*3); // c 스타일

     int (*myArr)[3] = static_case<int(*)[3]>malloc(sizeof(int)*2*3); // c++ 스타일

 

[정리]

1. 포인터 : 다른 지역의 변수를 접근하기 위해 사용한다.

2. 배열과 포인터 : 배열명은 자신의 첫 번째 원소의 시작 주소를 의미하는 상수 포인터.

                          이때 배열의 타입은 원소의 타입이여야 하고, 배열명을 사용하여 포인터에 저장할 경우, 

                          배열 전체 타입이 하나의 원소의 타입으로 축소된다. 이것을 decay(퇴화)라고 한다.

3. 배열포인터 : 배열 전체를 의미하는 포인터  // 타입(*포인터)[길이]

4. 포인터의 연산 : 포인터간의 연산(정수포함)은 제한적인 연산만이 가능하다.

                          포인터 - 포인터 = 정수

                      포인터 + 정수 = 포인터

                      포인터 - 정수 = 포인터

 

 

5. 함수의 포인터

     함수의 타입 : 리턴 타입과 매개변수 전체가 함수의 타입

     함수의 선언 : 함수의 심볼은 반드시 리턴 타입과 매개변수 사이에 위치

     ☞ 리턴타입 (*포인터명)(매개변수)