C 试图理解in指针的引用和地址

C 试图理解in指针的引用和地址,c,C,下面给出了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 addresss

下面给出了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);

}
#包括
int main(int argc,字符**argv)
{
//&商店地址
//*p1是一个指针
INTA=5,b=10;
int*p1,*p2;//p1和p2是两个可以存储int地址的指针
p1=&a;//现在p1和p2存储a和b的地址
p2=&b;
printf(“p1存储a=%d\n”的地址,*p1);
printf(“b的p2存储地址=%d\n”,*p2);
*p1=30;
*p2=40;
printf(“p1为p1指针赋值=%d\n”,*p1);
printf(“p2为p2指针赋值=%d\n”,*p2);
printf(“a,其值为=%d\n”,a);
printf(“b=%d\n”,b);
}

p1
p2
包含
a
b
的地址。当我们使用
*p1=30
它告诉编译器将
p1
中包含的变量whos address的值赋值为
30

您可以将其视为
p1
所包含的地址值,即
30

* = value at


p1
p2
包含
a
b
的地址。当我们使用
*p1=30
它告诉编译器将
p1
中包含的变量whos address的值赋值为
30

您可以将其视为
p1
所包含的地址值,即
30

* = value at


我认为如果你也打印指针本身,而不仅仅是它们的内容,事情会更清楚。您可以为此使用
%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);
}
#包括
int main()
{
INTA=10;
int b=20;
int*p=&a;
int*q=&b;
printf(“1)p是%p\n”,p);
printf(“1)q是%p\n”,q);
printf(“1)a是%d\n”,a);
printf(“1)b是%d\n”,b);
p=q;
/*在这一点上,我改变了p的值,使它指向'b'`
就像'q'一样。'a'和'b'仍然没有变化。*/
printf(“2)p是%p\n”,p);
printf(“2)q是%p\n”,q);
printf(“2)a是%d\n”,a);
printf(“2)b是%d\n”,b);
*p=30;
/*既然p指向'b',取消对指针的引用将影响'b'`
而不是“a”*/
printf(“3)p是%p\n”,p);
printf(“3)q是%p\n”,q);
printf(“3)a是%d\n”,a);
printf(“3)b是%d\n”,b);
}

当您说
*p=something
时,您正在分配
p
指向的内存位置(可能是
a
b
,具体取决于您的设置方式)。另一方面,如果你做了
p=q
你会改变指针本身,而不是它所指向的内容。

我认为如果你也打印指针本身,而不仅仅是指针的内容,事情会更清楚。您可以为此使用
%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);
}
#包括
int main()
{
INTA=10;
int b=20;
int*p=&a;
int*q=&b;
printf(“1)p是%p\n”,p);
printf(“1)q是%p\n”,q);
printf(“1)a是%d\n”,a);
printf(“1)b是%d\n”,b);
p=q;
/*在这一点上,我改变了p的值,使它指向'b'`
就像'q'一样。'a'和'b'仍然没有变化。*/
printf(“2)p是%p\n”,p);
printf(“2)q是%p\n”,q);
printf(“2)a是%d\n”,a);
printf(“2)b是%d\n”,b);
*p=30;
/*既然p指向'b',取消对指针的引用将影响'b'`
而不是“a”*/
printf(“3)p是%p\n”,p);
printf(“3)q是%p\n”,q);
printf(“3)a是%d\n”,a);
printf(“3)b是%d\n”,b);
}

当您说
*p=something
时,您正在分配
p
指向的内存位置(可能是
a
b
,具体取决于您的设置方式)。另一方面,如果你做了
p=q
你会改变指针本身,而不是它所指向的内容。

试着画一个自己理解的模式。指针包含变量的地址,可以用*pointer=value修改指针指向的空格<代码>*p1=30
将int 30存储在指向的内存地址
p1
处。
a
用作其值的内存。试着画一个自己理解的模式。指针包含变量的地址,可以用*pointer=value修改指针指向的空格<代码>*p1=30
将int 30存储在指向的内存地址
p1
处。
a
使用的内存用于其价值。感谢这个伟大的例子,我多次来此示例我很高兴知道它很有用:)感谢这个伟大的例子,我多次来此示例我很高兴知道它很有用:)