问题描述
- 有关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("%dn",*q);
printf("%dn",q);
printf("%dn",*p);
printf("%dn",p);}
解决方案
首先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,
解决方案二:
int *q = p;不就是q=p嘛 这里的【*q】是指针变量,变量是q,不是说【*q】是一个变量,
解决方案三:
q的值跟p是一样的。他们都指向i的地址,这样p,q本身的地址不一样嘛,因为他们是不同的变量,分配不同的地址
但是*p,*q是访问他们指向地址的值,都是i的值,所以相同。
解决方案四:
#include
main(){
int i = 2 ; //定义了一个整形变量i,值为2
int *p ; //定义了一个指向int的指针变量p,相当于指针变量p存放的是一个地址
p = &i ; //把i的地址赋值给指针p
int *q = p; //把指针p的地址赋值为指针q
printf("%dn",*q); //输出的是指针q地址的地址,即i的值2
printf("%dn",q); //输出的是q的地址
printf("%dn",*p); //输出的是p的地址的地址
printf("%dn",p); //输出的是p的地址
}
这些都很基础,你应该是才开始接触C指针吧!
解决方案五:
你前面所有的理解都是对的,唯独int *q = p;这句理解有误,其实按你的需求,代码应该这样写
int *q = 0;
*q = p;这样你才是将p这个地址值赋值给了*q;
因为在c/c++中声明指针的时候同时赋值的话其实是给指针赋值而不是给指针指向的内存赋值。
解决方案六:
个人认为C语言是门很“硬”的语言,同样C语言的精华“指针”也是一个“硬件”术语~
“*”“&”在表示什么,C语言语法里肯定有明确说明,但重要的是理解这些,需要计算机硬件,计算机基本组成有所了解~
这是之前接触指针整理的博客,希望对你有帮助~
http://blog.csdn.net/yunfenglw/article/details/24867883
解决方案七:
个人认为C语言是门很“硬”的语言,同样C语言的精华“指针”也是一个“硬件”术语~
“*”“&”在表示什么,C语言语法里肯定有明确说明,但重要的是理解这些,需要计算机硬件,计算机基本组成有所了解~
这是之前接触指针整理的博客,希望对你有帮助~
http://blog.csdn.net/yunfenglw/article/details/24867883
解决方案八:
此处不能将*p可作变量
纠正我刚才打字的几个错误:
应改成:
此处不能将*p看作定义的变量
还有
系统本身会为p变量分配内存单元,这个内存单元是用来存储i变量的地址200
应改成:
系统本身会为p变量分配内存单元,这个内存单元是用来存储i变量的地址2000
另外内存中地址(内存单元编号)都是以16进制展示,此处2000是按你上面举的例子解释。