c语言*p和p到底什么关系?
假如p=&a,那么p取得是a的地址,是说p的地址变为a的地址还是p的值变为a的地址,如果a的值为1,地址123h,p的地址是321h,那么编译器里*p返回结果是1还是12...
假如p=&a,那么p取得是a的地址,是说p的地址变为a的地址还是p的值变为a的地址,如果a的值为1,地址123h,p的地址是321h,那么编译器里*p返回结果是1还是123h,&p是123h还是321h?另外指针变量只能存储其他变量的地址吗?不能保存数据?跟普通变量有什么区别?
展开
4个回答
展开全部
"p的值变为a的地址"正确。p的值(不要说p的地址,因为p的地址是&p)不是321h而是123h。&p是存放变量p的地址唤销(这才源闭是p的地址,即存放p的地方),尽管可以用printf("%d\n",p);或用printf("%x\n",p);打印出来,但除了特殊要求外程序员并没有知道&p的必要,所以&p到底在哪里我们并不知道,也没有必要知道,即所谓对程和裂游序员是“透明”的。*p是取p指向的目标值,若此例中a==1,则有了p=&a;后,*p的值就是1。
展开全部
指针也是一个变量,所以p=&a只是把a的地址值123h赋值给变量p,而变量p当然也有自己的地址,就是你所说的321h,*p是解引用,相当于取得指针变量p的值所指向地址的存储内容,也就是123h地址对尺或应存储的值1。&p则是取得指针变量p的地址,所以就是321h,其中的关系可以看下这个图:
指针变量因为没有自己实体的存储空间,所以只能存储其他变量的地址,但是如果是你自己给指针分配的内存,当然也可以放入数据。比如:
int *p = (int*)malloc(sizeof(int));
*p = 100;
就是说给p这个地址里存储了100这个值。其实前面的p=&a也可以看做是存储了数据啊,&a的值不也是一种数据么。
因为指针p也是一个变量,所以p也是可以类似int变量一样自由赋值的,比如可以把p的指向换一个地址(当然,一旦这样做了,先前p所指向的内存地址就丢失了,无法再次取得地址进行空间的释放,就会出现常说的内存泄漏):
p = &a;
就把指针理解成一个一般的变量,自由赋值的时候(就是使用p=),可以指向其他有实际存储空间的变量,但是如果要存储实际数据的时候(陵吵伍就是使用*p=),就必须要有自己的存储空间。
所以,总结一下:指针和普通变量的区别就是它没有自己实际的存储空间,要么指向其他有实际存储空间的变量,要么就自己分配一个存储空间。
int a 碰唤= 100;
int b = 200;
int *e;
int *p;
e = (int*)0xffff;//指针变量e可以自由赋值,指向的0xffff地址。
*e = 10;//因为0xffff地址没有实际分配的存储空间,运行时会因为非法访问出现崩溃
printf("&a=[%p] &b=[%p] a=%d b=%d\n", &a, &b, a, b);//打印出变量a和b的地址和存储值。
p = &a;//将指针变量指向变量a的存储地址。
printf("[%p]: %d\n", p, *p);//输出a的地址和a的值。
p = &b;//将指针变量重新指向变量b的存储地址。
printf("[%p]: %d\n", p, *p);//输出b的地址和b的值。
*p = 1000;//将变量b存储的值修改为1000。
printf("[%p]: %d\n", p, b);//p仍然指向变量b的地址,b的值被修改为1000。
更多追问追答
追问
老师再问下,int p=&a等价于int *p=&a吗?
追答
int p=&a这种写法是错误的。编译器都不会通过的,不能将一个int*赋值给int类型
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
变量都有地址,指针变量也是变量,所以也有自己的地址。
一个变量在存在期间,自身地址不会改变,只是其内容可以变化。
指针变量的特殊性在于保存的是变燃虚量的地址,包括但不限于:int变量的地址,数组的地址,结构体的地址,指针变量的地址。。。
结合你的例子:
p的内容变为a的地址,123h,p的地址不会变
*p 的亮段败值就是a的值,是1
p本敬颤身也有地址,它的地址和a的地址不同,是321h
地址和值其实很好区分,地址的意思是上哪找到它,值的意思就是它里面保存了什么。
一个变量在存在期间,自身地址不会改变,只是其内容可以变化。
指针变量的特殊性在于保存的是变燃虚量的地址,包括但不限于:int变量的地址,数组的地址,结构体的地址,指针变量的地址。。。
结合你的例子:
p的内容变为a的地址,123h,p的地址不会变
*p 的亮段败值就是a的值,是1
p本敬颤身也有地址,它的地址和a的地址不同,是321h
地址和值其实很好区分,地址的意思是上哪找到它,值的意思就是它里面保存了什么。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是指针的问题吧。一般定义指针是 int *p
给指芦兄裂针p赋一个初值,那么p就代表这个值的地址陪闭,尘扰*p就是这个值的数值。
给指芦兄裂针p赋一个初值,那么p就代表这个值的地址陪闭,尘扰*p就是这个值的数值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询