2016-05-10 6 views
-1

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番目の例は不明です)、配列インデックスは変数として扱われ、私が想定しているアドレスではない?

+0

'int * a =&b;'。 – user3386109

+0

'*'は、それらが使われている文脈に依存する3つの異なる意味を持っています。 http://stackoverflow.com/questions/36962658/what-exactly-is-the-purpose-of-the-asterisk-in-pointers/36962697#36962697を参照してください。 –

+0

コンパイラの警告を無視しないでください。あなたが*別のことを証明できなければ、警告はエラーです。コンパイルエラーを伴うプログラムが何をしているのかを議論するのは意味がありません。 –

答えて

3

この:

int b = 5, c = 10; 
int *a = b; 

は動作しません。 2行目は次のことを意味します:

int *a; 
*a = b; 

しかし、そうではありません。それは、このことを意味します

int *a; 
a = b; 

上記のエラーは、あなたがこれを行うときことを意味します(!またはそうでないかもしれない、未定義の動作)

*a = c; 

あなたのプログラムがクラッシュし、aが無効なポインタ(そのポイントであるため、多くの点で間違っています)。

+0

私はそれが 'a = b'を意味することを知っています。それはちょうど省略表現と割り当てです。問題は、逆参照してcの値をその逆参照(b)に割り当てることによって、「a」に突然変異を起こすことでした。 – Byte

+0

@Byte:答えを広げました。上記をご覧ください。 –

+0

私は私の質問で小さな誤りを犯しました、私の謝罪。しかし、それは私の質問を無効にします。 – Byte

関連する問題