why a pointer can be assigned value?のような質問に対する回答を読んだことがありますが、ポインタの値を変更することについてはまだ混乱しています。いくつかのコメントは完全に正確ではないように見えますが、実装固有のものかもしれません。 (例:a[1] is exactly the same as writing *(a + 1). Obviously you can write *a = 3 since a is int*, so you can also write *(a + 1) = 3, so you can also write a[1] = 3
)。int配列への初期化されていないポインタに変数の値を割り当てることができるのはなぜですか?
*a = 3
を書くと、初期化によってポインタは整数なしのキャストなしになります。 segfaultと同様に。
私の質問は以下の通りです。
int main(void)
{
int b = 5, c = 10;
int *a = b;
*a = c; /* Will not work. (Should technically change the value of b to 10, leaving the pointer still pointing to b.) */
printf("%d\n", *a);
return 0;
}
上記の例では動作しません、と私は認識していない午前何らかの理由でセグメンテーション違反が、次の作品を制作します。
int main(void)
{
int a[10], i;
for (i = 0; i < 10; ++i) {
*(a + i) = i; /* Supposedly the same logic as '*a = c;', but works*/
}
for (i = 0; i < 10; ++i) {
printf("%d\n", *(a + i));
}
return 0;
}
あなたの時間と努力に感謝します。
**編集:これは* a = &bです(私はこれを知っていましたが、ループの2番目の例は不明です)、配列インデックスは変数として扱われ、私が想定しているアドレスではない?
'int * a =&b;'。 – user3386109
'*'は、それらが使われている文脈に依存する3つの異なる意味を持っています。 http://stackoverflow.com/questions/36962658/what-exactly-is-the-purpose-of-the-asterisk-in-pointers/36962697#36962697を参照してください。 –
コンパイラの警告を無視しないでください。あなたが*別のことを証明できなければ、警告はエラーです。コンパイルエラーを伴うプログラムが何をしているのかを議論するのは意味がありません。 –