포인터 사용시 주의해야할 것은 포인터 변수의 크기를 알아 내는 것입니다.
크기를 알아야 자료 복사나, 메모리 할당등을 할 수 있기 때문입니다.
여러가지 예제로 확인해보니, 주의할 점이 보이더군요.
1. 포인터 변수 자체의 크기인 경우
2. 포인터가 가르키는 것이 배열인 경우 그.. 배열의 크기가 됨.
3. 포인터가 가르키는 것이 배열인지, 행 하나인지 주의 할 것
아래 내용으로 어떤 차이들이 있는지 확인해보시기 바랍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | void main(void) { int arr[3][4] = { {1,2},{3,4,5},{6,7,8,9} }; //0행 : 1, 2, 0, 0 //1행 : 3, 4, 5, 0 //2행 : 6, 7, 8, 9 printf(" %d,", arr[2][1]); // 배열 2행 1열의 값은 (0열 다음값인) -> 7 printf(" %d,", *(*(arr+2)+1) ); // 배열 2행 1열의 값은 역시 -> 7 printf(" %d,", sizeof(arr)); // arr은 전체 배열의 크기인 3x4x4byte = 48 printf(" %d,", sizeof(arr+0)); // 이건 arr과 동일한 결과가 나올 것으로 예상했으나, 명시적으로 0번째 행을 // 지칭 하기 위해서 + 0 을 하는 것임. 0번 행의 포인터이므로 .. 포인터의 크기는 4byte printf(" %d,", sizeof(arr+1)); // 역시 포인터의 크기 -> 4 printf(" %d,", sizeof(arr+2)); // 포인터의 크기 -> 4 printf(" %d,", sizeof(*(arr+2))); // 포인터가 가르치는 곳(*연산자)이므로... 행의 크기 4x4byte = 16 printf(" %d,", sizeof(*(arr + 2)+1)); // 포인터의 포인터가 가르키는 곳(**)이므로... 열의 하나의 크기 -> 4 byte printf("Good bye"); // 결과 7, 7, 48, 4, 4, 4, 16, 4, } | cs |