기초

포인터, 2차원 배열

알쿠미 2015. 12. 19. 03:56

배열 포인터 정의

1
2
3
int    *nparr;                //1차원 배열 포인터
int    (*nparr2)[3];       //2차원 배열 포인터
int    (*nparr3)[2][3];  //3차원 배열 포인터
cs
위의 포인터들은 모두 4바이트이다. 2차원이라고 8바이트되는 것이 아니다.

컴파일러의 환경에 따라서 64비트면 포인터 크기는 8바이트라고 한다.

운영체제가 64비트라도 컴파일러가 32비트면 4바이트이다.

운영체제에서 32비트 호환을 지원하기 때문이라고 한다.

앞에 행이 몇개인지는 중요하지 않다.


1
2
3
4
5
6
7
8
9
10
11
int    narr[2];
int    *nparr;
 
cout<<sizeof(narr)<<endl;
cout<<sizeof(nparr)<<endl;
cout<<sizeof(*nparr)<<endl;
 
출력결과 : 
8
4
4
cs

narr의 크기는 배열 전체의 크기이므로 4*2 = 8 이고

nparr의 크기는 포인터이므로 4이고

*nparr의 크기는 가리키는 것에 대한 크기이다.


1
2
3
4
5
6
int    narr[3][2];
int    (*nparr)[2];
 
1) nparr = narr;
2) nparr = narr[0];
3) nparr = &narr[0][0];
cs

nparr은 배열을 대상으로 한 포인터 이기때문에 2), 번과 3)번과 같은 형태는 대입 되지 않는다.

2)번과 3번은 배열이라기 보다는 첫번째 값의 주소와 같은 개념이므로. 배열을 대상으로한 포인터가 아니다.


int narr[2][3] 이라는 것에서

sizeof(narr) == 2*3*4;

sizeof(narr[0]) == 3*4; // 행을 다 가르키기 때문에

엄연히 narr과 narr[0]는 다르다.


1
2
3
4
5
6
7
8
9
 
    int narr[2][3= {{1,2,3},{456}};
    int *nparr1;
    int (*nparr2)[3];
 
    nparr1 = &narr[0][0];
    nparr2 = narr;
 
    cout<<*(*(nparr2+1)+2)<<endl;
// 안에 덧셈은 행 증가 뒤에 덧셈은 열증가
cs

2차원 배열 포인터 대입 방법

nparr1 은 아무리 2차원 배열 처럼 더해도 1차원이라서 하나씩 증가된다.(배열의 끝까지 증가가능)

포인터는 계속 증가하면 배열의 끝까지 계속 갈수 있다.

2차원 배열 포인터는 증가하면 행이 증가된다.