问题描述
- 关于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。也就是说把这个有效值或者垃圾只输出,但是实际电脑运行的结果是地址,那么我的问题是:*运算符不是获取数据运算符吗?
解决方案
修正下
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
解决方案三:
对于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了