TangLMalan
2015-05-06 03:50
采纳率: 42.9%
浏览 2.8k
已采纳

关于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条回答 默认 最新

  • threenewbee 2015-05-06 04:09
    已采纳

    修正下
    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

    已采纳该答案
    打赏 评论
  • threenewbee 2015-05-06 04:05

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

    打赏 评论
  • Dean_Deng 2015-05-06 05:44

    对于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了

    打赏 评论
  • YXTS122 2015-09-29 12:35

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

    打赏 评论
  • YXTS122 2015-09-29 13:02

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

    打赏 评论
  • YXTS122 2015-09-29 13:46

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

    打赏 评论

相关推荐 更多相似问题