인프런 커뮤니티 질문&답변

당황한 청어님의 프로필 이미지
당황한 청어

작성한 질문수

홍정모의 따라하며 배우는 C언어

11.8 문자열의 포인터를 정렬하기

dereferenced 이중포인터의 연산에 질문

작성

·

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 인덱스 원소 값을 간접참조로 가져오는 것일 뿐입니다. 

 

당황한 청어님의 프로필 이미지
당황한 청어

작성한 질문수

질문하기