작성
·
240
0
void prointIntArray(double** arr, int n)
{
for (int i = 0; i < n; ++i)
printf("%p \n", *arr + i);
printf("\n");
}
int main()
{
double* arr_i[] = { (double[]) { 0,1,2,3 }, (double[]) { 4,5,6,7,8 }, (double[]) { 9,10,11 } };
int n_i = sizeof(arr_i) / sizeof(arr_i[0]);
prointIntArray(arr_i, n_i);
return 0;
}
/* Output
006FFA34 // (double) 크기만큼 이동함을 확인할 수 있습니다.
006FFA3C // arr은 이중포인터니 *arr도 포인터 아닌가요?
006FFA44 // 이 값은 포인터 크기만큼 움직여야 할 것 같습니다.
*/
void printStrLiteral(char** arr, int n)
{
for (int i = 0; i < n; ++i)
printf("%p \n", *arr + i );
printf("\n");
}
int main()
{
char* arr[] = { "Cherry", "AppleBee", "Pineappple", "Apple", "Orange" };
int n = sizeof(arr) / sizeof(arr[0]);
printStrLiteral(arr, 5);
}
/* Output
00AC7E40 // 이중포인터를 dereference하여도 여전히 포인터입니다.
00AC7E41 // 포인터 + 1 연산을 했을 때 4byte를 이동해야할 것 같습니다.
00AC7E42 // base type 만큼 움직이고 있습니다.
00AC7E43
00AC7E44
*/
이중 포인터를 derefrence해도 pointer입니다. pointer 크기만큼 이동해야할 거 같은데 base type 크기만큼 이동하는 이유가 있을까요?
답변 1
1
arr 의 원소는 double * 들입니다.
그리고 *arr + i 는 arr[i] 와 같은 표현이나 마찬가지입니다. (간접 참조 및 포인터 연산이므로)
질문자님께서는 arr[0] 와 arr[1] 의 "값"이 4 가 차이나야하지 않냐고 묻고 계신거에요!
int arr { 100, 200, 300 } 이라는 배열이 있다고 가정해보면
*arr + 2 는 arr[2] 와 같으며 300 이라는 "값"을 가져옵니다. *arr + 1 은 200이구요. (이 둘이 4씩 차이나는게 아니죠. 그저 값이 다른 것 뿐)
int 의 크기가 4byte 라는 것은 이 원소들의 "값"이 4 씩 차이나는 것이 아니라 원소들의 "주소"가 4 씩 차이난다는거죠! 4byte 크기의 메모리가 이웃해있는거니까요.
double* 배열인 arr의 *arr + i 은 말 그대로 이 double* 배열의 "원소 값"을 의미하며, 위의 예처럼 원소 값은 다양할 수 있습니다. 4씩 차이나야하는 것이 아니라 그냥 자유롭게 어떤 주소값(=double * 타입의 "값")이든 원소로 들어간다는거죠.
*arr + i 는 그저 해당 배열의 i 인덱스 원소 값을 간접참조로 가져오는 것일 뿐입니다.