기초
포인터, 2차원 배열
알쿠미
2015. 12. 19. 03:56
배열 포인터 정의
1 2 3 | int *nparr; //1차원 배열 포인터 int (*nparr2)[3]; //2차원 배열 포인터 int (*nparr3)[2][3]; //3차원 배열 포인터 | cs |
컴파일러의 환경에 따라서 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},{4, 5, 6}}; int *nparr1; int (*nparr2)[3]; nparr1 = &narr[0][0]; nparr2 = narr; cout<<*(*(nparr2+1)+2)<<endl; // 안에 덧셈은 행 증가 뒤에 덧셈은 열증가 | cs |
2차원 배열 포인터 대입 방법
nparr1 은 아무리 2차원 배열 처럼 더해도 1차원이라서 하나씩 증가된다.(배열의 끝까지 증가가능)
포인터는 계속 증가하면 배열의 끝까지 계속 갈수 있다.
2차원 배열 포인터는 증가하면 행이 증가된다.