C 试图理解in指针的引用和地址
下面给出了a和b值为什么会改变的代码。P1和p2存储a和b的地址,当P1和p2改变时,a和b为什么会改变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
#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
使用的内存用于其价值。感谢这个伟大的例子,我多次来此示例我很高兴知道它很有用:)感谢这个伟大的例子,我多次来此示例我很高兴知道它很有用:)