1

次のコードの cc は配列 c のベースアドレスを保持していますか、それとも「Hello」からのアルファベット「H」のアドレスを保持していますか? 答えがベースアドレスの場合、cc++ を実行した後に cc が 8 バイトずつインクリメントされないのはなぜですか?

void foo(char *cc[])
{
    printf("%x\n",cc);
    cc++;
    printf("%x\n",cc);
}

int main()
{
    char *c[] = {"Hello","World"};
    foo(c);
}
4

4 に答える 4

5

cポインタの配列です。最初のポインター ( ) は、文字Helloとそれに続くヌルc[0]文字で構成される文字の配列を指します。Worldの後にヌル文字が続く文字の別の配列を指します。c[1]

ccということでc[0]、上記のとおりとさせていただきます。インクリメントは上記ccと同じになります。c[1]

何が起こっているのかをよりよく理解するために、これらのことを紙に描くのが最善です.

于 2012-04-26T13:14:14.470 に答える
2

sizeof(char*)配列要素がchar*次のように、何であれインクリメントされます。

#include <stdio.h>

void foo(char *cc[])
{
    printf("%x %s\n",cc,*cc);
    cc++;
    printf("%x %s\n",cc, *cc);
}

int main()
{
    char *c[] = {"Hello","World"};
    printf("sizeof(char*)=%d\n", sizeof(char*));
    foo(c);
    return 0;
}

出力:

sizeof(char*)=4
bf8fd910 こんにちは
bf8fd914 世界

bf8fd914 - bf8fd910 = 4

于 2012-04-26T13:14:08.790 に答える
1
void foo(char *cc[])
{
    printf("%p\n",cc);
    cc++;
    printf("%p\n",cc);
}

int main()
{
    char *c[] = {"Hello","World", "yo"};
    foo(c);

    int *p = new int[1];
    int *q = p + 1;
    printf("p = %p and p+1 = %p \n", p, q);

    printf("sizeof(int) = %u, sizeof(dptr)=%u and sizeof
        sizeof(int), sizeof(c), sizeof(*c));
}

各ポインターは、指している要素の値 = サイズによってインクリメントされます。
したがって、int ポインターは 4 バイトずつインクリメントされます。
cc = {"hello", "world"} ポインターは 16 バイトずつ増加します。つまり、ptr あたり 8 バイト * 2
であり、cc = {"hello", "world", "yo"} ポインターは 24 バイト、つまり 8 バイトずつ増加します。ポイントあたり * 3

cc ポインターが静的に初期化されていない場合、つまり (char **c)、c は通常のポインターとして機能します。8 バイトずつ増加します。

于 2012-04-26T13:26:17.480 に答える
0

cc の配列には 2 つのポインターがあります。1 つは "hello" へのポイント、もう 1 つは "world" へのポイントです! cc はポインターを格納する配列です!

于 2012-04-27T14:18:59.660 に答える