有关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个回答

首先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】是一个变量,
danielinbiti
danielinbiti 回复易天曦: int *q = p;这句话中,是申明指针变量q,然后q=p的意思,不是*q=p
5 年多之前 回复
yzy4829229
TangLMalan 这个*p不就是间接访问的数值吗?p是存储这个数值的地址
5 年多之前 回复

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("%d\n",*q); //输出的是指针q地址的地址,即i的值2
printf("%d\n",q); //输出的是q的地址
printf("%d\n",*p); //输出的是p的地址的地址
printf("%d\n",p); //输出的是p的地址
}
这些都很基础,你应该是才开始接触C指针吧!

chenzhengchaoStart
有何不可- 输出的是p的地址的地址 这句应该改为 输出的是P指针所指向内存地址中存放的数据值
5 年多之前 回复
yzy4829229
TangLMalan 地址的地址是什么意思
5 年多之前 回复
yzy4829229
TangLMalan 嗯,刚学。不懂
5 年多之前 回复

你前面所有的理解都是对的,唯独int *q = p;这句理解有误,其实按你的需求,代码应该这样写
int *q = 0;
*q = p;这样你才是将p这个地址值赋值给了*q;
因为在c/c++中声明指针的时候同时赋值的话其实是给指针赋值而不是给指针指向的内存赋值。

yzy4829229
TangLMalan 我懂了,因为 int *q - p 。 这里面有一个*运算符,而它是遵从从右往左的顺序,所以应该就是,变量q先接收了p,也就是2000.然后在*运算,所以得到的结果是i的值就是3.
5 年多之前 回复

个人认为C语言是门很“硬”的语言,同样C语言的精华“指针”也是一个“硬件”术语~
“*”“&”在表示什么,C语言语法里肯定有明确说明,但重要的是理解这些,需要计算机硬件,计算机基本组成有所了解~
这是之前接触指针整理的博客,希望对你有帮助~
http://blog.csdn.net/yunfenglw/article/details/24867883

个人认为C语言是门很“硬”的语言,同样C语言的精华“指针”也是一个“硬件”术语~
“*”“&”在表示什么,C语言语法里肯定有明确说明,但重要的是理解这些,需要计算机硬件,计算机基本组成有所了解~
这是之前接触指针整理的博客,希望对你有帮助~
http://blog.csdn.net/yunfenglw/article/details/24867883

yzy4829229
TangLMalan 已经收藏,今天一定看,谢谢师傅
5 年多之前 回复

此处不能将*p可作变量
纠正我刚才打字的几个错误:
应改成:
此处不能将*p看作定义的变量
还有
系统本身会为p变量分配内存单元,这个内存单元是用来存储i变量的地址200
应改成:
系统本身会为p变量分配内存单元,这个内存单元是用来存储i变量的地址2000
另外内存中地址(内存单元编号)都是以16进制展示,此处2000是按你上面举的例子解释。

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