2016-04-09 12 views
1

なぜaとbの値が変化するのでしょうか?P1とp2はaとbのアドレスを格納しています。なぜp1とp2を変更するとaとbが変わるのですか?ポインタの参照とアドレスを理解しようとする

#include <stdio.h> 


int main(int argc, char** argv) 
{ 

//&a stores address 
//*p1 is a pointer 

int a = 5, b = 10; 
int *p1, *p2; //p1 and p2 are 2 pointers which can store int addressses 

p1 = &a; //now p1 and p2 stores address of a and b 
p2 = &b; 



    printf("p1 storing address of a = %d\n", *p1); 
printf("p2 storing address of b = %d\n", *p2); 

*p1=30; 
*p2=40; 

printf("p1 assigning values to p1 pointer = %d\n", *p1); 
printf("p2 assigning values to p2 pointer= %d\n", *p2); 



printf("a whose value is = %d\n", a); 
printf("b = %d\n", b); 

} 
+1

自分で理解できるスキーマを作成しようとします。ポインタに変数のアドレスが含まれている場合、* pointer = value;でポインターが指すスペースを変更できます。 –

+2

'* p1 = 30'は、メモリアドレス' p1'を指すint30を格納します。 'a'がその値に使うメモリ。 – totoro

答えて

3

私はあなたにも、ポインタそのものだけではなく、その内容を印刷する場合、物事はあなたのためのより明確になると思います。そのためには%p指定子を使用できます。

#include <stdio.h> 

int main() 
{ 
    int a = 10; 
    int b = 20; 
    int *p = &a; 
    int *q = &b; 

    printf("1) p is %p\n", p); 
    printf("1) q is %p\n", q); 
    printf("1) a is %d\n", a); 
    printf("1) b is %d\n", b); 

    p = q; 

    /* At this point, I changed the value of p so that it points to `b` 
    just like `q` does. `a` and `b` are still unchanged. */ 
    printf("2) p is %p\n", p); 
    printf("2) q is %p\n", q); 
    printf("2) a is %d\n", a); 
    printf("2) b is %d\n", b); 

    *p = 30; 

    /* Now that p points to `b`, dereferencing the pointer will affect `b` 
    instead of `a` */ 
    printf("3) p is %p\n", p); 
    printf("3) q is %p\n", q); 
    printf("3) a is %d\n", a); 
    printf("3) b is %d\n", b); 
} 

あなたはpは(あなたが物事をセットアップする方法に応じaまたはbであるかもしれない)を指していることをメモリ位置を割り当てている*p = something言います。一方、p = qを実行すると、ポインター自体を変更し、ポインターの内容は変更しません。

+0

素晴らしい例をありがとう、私はこの例に何度も来ています – TheGameiswar

+0

私はそれが役に立ちました嬉しいです:) – hugomg

1

p1およびp2は、aおよびbのアドレスを含みます。我々は*p1=30; を使用する場合、それはあなたが30するp1によってconainedアドレスの値としてそれを考えることができます30

としてp1に含まれる変数玉葉アドレスの値を代入するようにコンパイラーに指示します。

* = value at 

& = address of 
関連する問題