宣言により、 charchar buffer[9] = "12345678";
の配列が作成されます。
ここで、は最初の要素のアドレスですが、配列のアドレスではありません。 9
buffer
char* pBuffer = buffer;
pBuffer
は、 char へのポインター として正しい式であり、最初の要素をアドレス指定できます。
しかし、配列をアドレス指定できないため、式char* pBuffer = &buffer
は間違っています。pBuffer
(コードのエラー、&buffer
以下で説明する配列のアドレス)
buffer
との違い&buffer
&buffer
配列のアドレスを意味します。との値は実際には同じですが、意味的には両方とも異なります。1 つは文字のアドレスで、もう 1 つは 9 文字の配列のアドレスです。buffer
&buffer
buffer[9] = "12345678";
+----+----+----+---+---+----+----+----+---+----+
| '1'| '2' |'3'|'4'|'5'| '6'| '7'|'8' | 0 | ...........
+----+----+----+---+---+----+----+----+---+---+----+
201 202 203 204 205 206 207 208 209 210 211
^ ^
| |
(buffer) (buffer + 1)
| |
|-----------------------------------------|--------
|201 | 210
^ ^
| |
(&buffer) (&buffer + 1)
アドレスに 16 進数ではなく 10 進数を使用しました
is の値とbuffer
is201
の値です&buffer
が201
、 意味は異なります。
buffer
: 最初の要素のアドレス — その型はchar*
.
&buffer
: 完全な char 配列のアドレス — その型はchar(*)[9]
.
さらに、違いを観察するには、次を追加し1
ます。
buffer + 1
それは202
2番目の配列要素のアドレスです'2'
が、次の配列のアドレス
&buffer + 1
は210
どちらですか。
私のシステムでは、次のコードを書きます。
int main(){
char buffer[9] = "12345678";
char (*pBuffer)[9] = &buffer;
printf("\n %p, %p\n",buffer, buffer+1);
printf("\n %p, %p\n",(&buffer), (&buffer+1));
}
出力は次のとおりです。
0xbfdc0343, 0xbfdc0344
0xbfdc0343, 0xbfdc034c
[答え]
それがエラーの理由です:
エラー: 初期化で 'char ( )[9]' を 'char ' に 変換できません
'char (*)[9]'
タイプ値をに割り当てようとしていchar*
ます。
char (*ptr2)[9];
Here ptr2 is pointer to an array of 9 chars
、 And this time
ptr2=&buffer
は有効な式です。
コードを修正するには?
ネイト・チャンドラーの答えのように:
char buffer[9] = "12345678";
char* pBuffer = buffer;
または別のアプローチ、
char buffer[9] = "12345678";
char (*pBuffer)[9] = &buffer;
どちらを選択するかは、必要なものによって異なります。