4

私はcポインターに手を出していて、次のコードを説明できませんでした。

int main()
{
    int i = -3; 
    int *ptr;
    int **ptr2;
    int ***ptr3;
    ptr = &i; 
    ptr2 = &ptr;
    ptr3 = &ptr2;
    printf("ptr = %p\n",(void *)ptr);
    printf("&ptr = %p\n",(void *)&ptr);
    printAddr(&ptr);
    printAddr2(&ptr2);
    printAddr3(&ptr3);
    return 0;
}

void printAddr(int **num)
{
    printf("address of int ** = %p\n", (void *)&num);
}

void printAddr2(int ***num)
{
    printf("address of int *** = %p\n", (void *)&num);
}
void printAddr3(int ****num)
{
    printf("address of int **** = %p\n", (void *)&num);
}

出力は次のとおりです。

ptr = 0xbf9d64a0 
&ptr = 0xbf9d64a4
address of int ** = 0xbf9d6490
address of int *** = 0xbf9d6490
address of int **** = 0xbf9d6490

私の疑問は、なぜ対処する必要があるのか​​ということ(address(int)) == address(address(address(int)))です。

説明してくれてありがとう。

私はこの質問が関連していることを発見しました:

再帰的ポインター

しかし、作者はそれらを等しくなるように明示的に割り当てています。

4

1 に答える 1

5
void printAddr(int **num)
{
   printf("address of int ** = %p\n",(void *)&num);
}

これにより、関数が受け取った渡された値のコピーのアドレスが出力されます。これらの関数はすべて引数を1つだけ取り、呼び出し間で割り当てが行われないため、これらはすべてスタックの同じ場所に割り当てられる可能性があります。

のポインタのアドレスを確認したい場合は、ポインタをmain直接印刷するかmain、関数を使用する必要があります。

void printAddress(void* p) {
    printf("%p\n", p);
}

そしてそれを

printAddress(&ptr3);

于 2012-11-26T00:00:15.050 に答える