关于C语言指针相加问题

代码:

include

main(){
int a , *p;
a = 3 ;
p = &a ;
int *q = p + 1;
printf("p is %d",p);
printf("q is %d",q);
printf("*q is %d",*q);

}
运行结果:

p is 2293308q is 2293312*q is 2293312

Process exited after 0.1425 seconds with return value 13
请按任意键继续. . .

我的理解是:变量P存储了指针a。而变量q是指针+指针,也就是说,变量q是加的是a地址后面的那个变量,至于这个变量值是多少,我不知道,可能是一个有效值,也可能是一个垃圾值,我在第三个输出的时候是*q。也就是说把这个有效值或者垃圾只输出,但是实际电脑运行的结果是地址,那么我的问题是:*运算符不是获取数据运算符吗?

6个回答

修正下
a p q的地址关系为 p=a+4 q=p+4(4就是一个整数的大小)
p的值等于a的地址
q的值等于p+1,也就是p的地址+sizeof(int)=p的地址+4,正好也是q的地址
对q再取值,因为前面分析了,q的值就是q的地址,所以q的取值就是q

p的值等于a的地址
q的值等于p+1,也就是a的地址+sizeof(int)=a的地址+4,正好也是p的地址
q的指针就是q的地址,因为你在堆栈上依次分配了a p q,所以相当于p的地址+4

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复易天曦: 麻烦你将鼠标移动到我回答的右边,点下蓝色的采纳,谢谢
5 年多之前 回复
yzy4829229
TangLMalan 懂了,太感谢你了
5 年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复易天曦: 看我修正后的回答。堆栈不用管,你可以理解为C在内存中连续分配了a p q
5 年多之前 回复
yzy4829229
TangLMalan 堆栈是什么?
5 年多之前 回复

对于int * p;的理解很重要

int a , *p;
a = 3 ;
p = &a ;

此处int * 应该看作一个整体一种数据类型,p是变量,
表示p中只能存储int型变量的地址
所以上面的语句也等价于

 a = 3 ;
 int a , * p= &a ;

同样这句

 int *q = p + 1; 

表示定义了int *类型的变量q,注意此处变量是q,并不是*q,
这句表示把p+1的值赋给变量q,
p中存储的是a变量的地址,p+1表示a变量在内存中的地址(内存单元编号)加1
所以q变量中存储的a变量的地址(内存单元编号)+1的值。
这个时候p,q都是不同的地址(不同的内存单元编号)
q所指向的这个内存单元(a的内存单元编号+1的那块内存单元)在程序中并没有人为的赋值,
所以编译器会随机赋给它一个垃圾值。这样的话会输出*q输出的值实际上是编译器给的垃圾值。
你不能觉得这个值大就认为它是地址。
如果真的想修改q所指向的内存单元的变量的值,应该编写如下的代码:

 int *q = p + 1; 
 *q = (*p) + 1

这个时候输出*q应该就是4了
应为*是取地址运算符的逆运算,
p指向了a的存储单元,*p完全等价于a
所以(*p) +1 = 3 + 1
这个*q就表示以q的内容为地址的变量,*q就是4了

我输出的结果是这样子的图片

*q 哪里是地址了,我不认为图片

看吧,*q 的值不就变了图片

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐