3

私が書く場合:

char string[] = "some string";
char **ptr = &string;
printf("%s\n",*ptr);

何も出力せず、警告を出します:warning: initialization from incompatible pointer type [enabled by default]

さて、次のように書くと:

char *string = "another string";
char **ptr = &string;
printf("%s\n",*ptr);

それは大丈夫です。

string[]に似たポインターに減衰して動作するべきではありません*stringか? なぜそうしないのですか?

4

4 に答える 4

9

それは、この場合の減衰の仕組みではありません。C のよくある質問を参照してください

6.12 Q: 配列参照はポインターに分解されるため、 が配列の場合、とarrの違いは何ですか?arr&arr

A: 標準 C では、&arrT の配列へのポインター型のポインターを配列全体に生成します。

だから、あなたがするとき:

char string[] = "some string";
char **ptr = &string;

&stringタイプが「長さ 12 の char 配列へのポインター」であるため、割り当ては失敗します。代わりに次のように書くこともできます:

char (*ptr)[12] = &string; 

これは(ほとんどの場合、あなたがやろうとしていることではありませんが)「ptrを12文字の配列へのポインターとして宣言する」と読みます

ポインターからポインターへのポインターを本当に取得したい場合は、いつでも中間変数を使用できます。

char string[] = "some string";
char *ptr = string;
char **doublepointer = &ptr;
printf("%s",*doublepointer);
于 2013-08-05T05:53:28.983 に答える
4

配列へのポインターという名前の概念があります。配列を指すポインターを使用していますが、それは方法ではありません。配列へのポインターをポイントする場合は、必要な出力を取得する以下の方法を試してください。

char string[] = "some string";
char (*ptr)[]=&string;
printf("%s",*ptr);
于 2013-08-05T05:50:20.940 に答える
0

1つ目stringは配列です。そのアドレスは次の配列を指しています。

+-+-+-+-+-+-+-+-+-+-+-+
|s|o|m|e| |s|t|r|i|n|g|
+-+-+-+-+-+-+-+-+-+-+-+

この配列のアドレスは、配列へのポインタなので、*char[].

2 番目stringは、(おそらく、実装によっては) 読み取り専用スペースにある同じ文字列を指すポインターです。

+------+    +-+-+-+-+-+-+-+-+-+-+-+
| addr | -> |s|o|m|e| |s|t|r|i|n|g|
+------+    +-+-+-+-+-+-+-+-+-+-+-+

このポインタのアドレスは**char.

于 2013-08-05T06:36:39.413 に答える
0

Actually if I can add to Timothy's answer, the char (*ptr)[12] = &string; type of pointer is fairly unusual as it is a pointer to an array of particular type and size.

Let's see what happens when we print its address before and after we've incremented it by one:

char string[] = "some string";
char (*ptr)[12] = &string;
printf("Before: %p\n", (void*)(ptr));
printf("After:  %p\n", (void*)(ptr+1));

Which prints:

Before: 0xbfec44e0
After:  0xbfec44ec

Notice how in the second case the pointer has been moved 12 blocks of memory. Since the pointer knows the size of the type it points to this applies in the case of an array as well, not just for any plain old type. Which in our case is 12.

There's an indepth explanation of this here, that you migh want to read.

于 2013-08-05T06:28:48.397 に答える