关于C语言中指针变量的问题

int main(void)
{
int a = 15, b = 99, c = 22, d = 45;
int *p = &a;
int *q = &b;
*p = c;
*q= d;
printf("%d, %d, %d, %d\n", a, b, c, d);
system("pause");
return 0;
}

输出结果是22,45,22,45

为什么指针变量p和q的值改变成c和d的值以后,a和b的值也发生变化了?

int a = 15, b = 99, c = 22, d = 45;【a=15,b=99,c=22,d=45】

int *p = &a;【变量p指向变量a,p指向的单元的内容(*p)是15】

int *q = &b;【变量q指向变量b,q指向的单元的内容(*q)是99】

*p=c;【给p指向的单元赋值,而不是给p赋值,由于p指向变量a的单元,则相当于给a的内容赋值c的值】
*q=d;【同理】
后面语句中的*p赋值和变量定义语句中的*p赋值是不同的,变量定义int *p=&a;可以分解写成int *p; p=&a;是它的简写形式,简写形式是给p赋值而不是*p,因为在变量定义语句中的*表示的是变量类型而不是指p指向的单元的意思,可以看成:int* p=&a;这里的p变量类型是int *,后面的赋值是给变量赋值。追问

非常感谢你的回答,但还稍微有一点不理解:


你说:*p=c;【给p指向的单元赋值,而不是给p赋值,由于p指向变量a的单元,则相当于给a的内容赋值c的值】,


也就是说这个赋值行为,是针对p这个指针所对应的单元里的内容的,而不是只单纯地把这个指针方向由a变成b吗?


麻烦看下下面那张图,因为我看到的网上课程里面它讲的只是把指针指向的方向变了而已。。。

追答

给p指向单元赋值变量c的值:*p=c;
使p指向c:p=&c;

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-10-23
因为p是指向a的指针,也就是说,p里存放的是a的地址,所以*p=c,实际上是先取出p的内容作为地址,然后修改那个地址里的内容为c,所以也就修改了啊。
q是一样的道理。追问

非常感谢你的回答,但还稍微有一点不理解:


是不是就是说*p=c; 这个赋值行为,是针对p这个指针所对应的单元里的内容的,而不是只单纯地把这个指针方向由a变成b吗?


麻烦看下下面那张图,因为我看到的网上课程里面它讲的只是把指针指向的方向变了而已。。。


追答

并不是改变指针的方向,而是改变指针指向的地址里的内容,这么理解。你配的这幅图,跟你的代码不符合,是错误的。
这幅图对应的代码应该是
a = 99.5
b = 10.6;
p1=&a;
p1=&b;

第2个回答  2016-10-23
因为 p是指向a的地址、q是指向b的地址的

~

c语言指针的赋值问题
在C语言中,指针是一个变量,其特殊之处在于它存储的是其他变量的地址,而不是值本身。指针使我们能够间接地访问和修改变量的值。指针的赋值过程 当我们为指针变量赋值时,实际上是将其指向一个变量的内存地址赋给它。这个过程分为两步:首先确定变量的地址,然后将这个地址赋给指针变量。例如,如果我们...

有关于计算机C语言的Pointer问题
在探讨计算机C语言的Pointer问题时,我们需要首先理解Pointer的基本概念。Pointer是一种存储变量地址的变量,它在C语言中扮演着至关重要的角色。让我们逐一解析这六种情况,以更直观的方式理解Pointer。1. 定义一个整型变量k,并将k的地址赋给指针t。这表示我们创建了一个指向整型变量的Pointer,可以用来操...

c语言中指针变量的作用?
return 0。

c语言问题,关于指针的问题
一、比如我们定义一个int型指针变量。int *p=NULL;初值为空。那么当执行while(p);时,只有p==NULL时,while循环才会结束。所以如果我们写while(p);printf。。。;那么只有当p为空时,后面的printf才会执行。否则就一直循环,这样我们就能判断p为空了。同理!p,自然就能判断p不为空了。二、p...

C语言中的指针为什么会改变变量的值?
pa=&a;句是将指针*pa指向变量a。pa存放的是a的地址,*pa其实就是a,可以理解为把a换了一个名字表示。*pa=20就是对a进行赋值操作,等于a=20;a的值当然改变了。看看指针的知识吧!

C 语言 指针变量的定义问题
(1)该指针变量指向的变量的类型。如i_pointer指向的变量i是整型。(2)该指针变量在内存中占多少内存单元。如i_pointer占两个内存单元,称为“近指针”,用near表示。如果该变量在内存中占4个内存单元,称为“远指针”,用far表示。如果未指定near或far,缺省是near。(指针变量在内存中要么占2个...

c语言程序指针问题
分析:C语言中约定,指针变量是一个变量,地址为其值;数组名是一个常量指针,在 系统为数组分配存储单元时确定,其值是该数组首元素的地址。因此.数组名不能自增自减 ,也不能在赋值语句中作左值.例程中企图通过对a的改变使指针下移,指向欲输入数据的数 组元素。它的错误在于不了解数组名代表的是...

c语言变量的地址和指针
指针是C语言中的一个重要概念,它是一种特殊的变量,用于存储其他变量的地址。指针变量本身也占用内存空间,但它里面存放的值是另一个变量的地址。通过使用指针,我们可以间接地访问和操作其他变量。指针的定义形式为“类型名 *指针变量名”,例如`int *p;`就定义了一个指向整型变量的指针`p...

C语言指针问题
变量之间互相赋值是正确的。“原因是被赋值的指针变量前不能再加*说明符”这句话的意思是:如果 给 指针P加上“*”,那么它就变成 了变量,代表的意义就变了,而地址只能赋值给指针不能给变量。最后建议学习看书一定要读国外原著,国内翻译或作者的理解或描述,未必就是正确和合适的。

C语言指针变量问题
C语言里面的指针和数组是很有趣的。例如定义数组a[10],你可以通过a[1]访问里面的元素,也可以通过*(a+1),来访问。为什么这里可以这样用呢?ptr的类型为(int *),所以ptr在内存里面存放的就是int类型的指针,指向了某个int地址。正常情况下,你可以通过ptr访问它指向的某一个地址里面的数据,如...

相似回答