TangLMalan 2015-05-05 14:26 采纳率: 0%
浏览 1691
已采纳

有关C语言指针的传递问题

int i = 3 ;
int *p ;
p = &i ;
int *q = p;

问题:先定义一个数值为3的变量 i 。然后把i的地址传递给变量p。那么变量p的内存单元中存储的就是i的地址,假如说是2000,那么p就是2000.
*p就是间接访问i,也就是说*p是3.
再定义一个变量q。*q也是间接访问的数值,这里等于p,也就是说*q 是2000.
我的理解是内存中存在一个变量,里面存的是2000.那么我如果输出q。那么就应该是
内存中数值为2000的这个变量的地址对吗?至于数值等于2000是哪一个地址,我不知道,但是这里的*q确实是间接访问了数值为2000的变量,假如存在无数多个这样的地址,那么最少计算机也应该随机输出一个地址才对。
但运行的结果 *q的值等于i 等于 2;而q 存储地址的数值等于p的存储地址的值。
那么刚刚我列出的是*q = p 。而计算机实际上运行的结果怎么就是q = p 呢?
代码:
# include
main(){
int i = 2 ;
int *p ;
p = &i ;
int *q = p;
printf("%d\n",*q);
printf("%d\n",q);
printf("%d\n",*p);
printf("%d\n",p);

}

  • 写回答

8条回答 默认 最新

  • Dean_Deng 2015-05-06 02:57
    关注

    首先int * p表示p是变量,它的类型是int *,也就是说p只能存储int类型变量的地址,此处不能将*p可作变量。
    所以

     int i = 2;
     int * p;
     p = &i;
    

    等价于

     int i = 2;
     int * p = &i;
    

    同样你下面的

     int * q = p;
    
    

    应该理解成定义了一个q变量,它的类型是int *,意思就是q变量中只能存储int类型变量的地址
    这句其实只是给q变量赋值,意思是你把p变量的值赋给了q。
    而p变量中保存了i的地址,所以q变量中此时也保存了i变量的地址。
    这样的话p变量和q变量同时指向了i变量在内存中的那块存储单元。
    此时*p和*q完全等价于i变量,所以输出*q是i的值,说出q是i变量的地址

    系统本身会为p变量分配内存单元,这个内存单元是用来存储i变量的地址200
    但p变量本身分配的内存单元编号(内存单元编号就是地址)绝对不是这个2000,是另外一个值。
    如果q中真想保存p变量本身的地址,实际上需要多级指针变量int ** q = &p,

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。