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?另外指针变量只能存储其他变量的地址吗?不能保存数据?跟普通变量有什么区别? 展开
 我来答
White_MouseYBZ
2019-05-18 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6592万
展开全部
"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。
never715
2019-05-18 · TA获得超过942个赞
知道小有建树答主
回答量:1010
采纳率:84%
帮助的人:461万
展开全部

指针也是一个变量,所以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类型
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
heptnaol
2019-05-18 · TA获得超过7261个赞
知道大有可为答主
回答量:7120
采纳率:78%
帮助的人:1807万
展开全部
变量都有地址,指针变量也是变量,所以也有自己的地址。
一个变量在存在期间,自身地址不会改变,只是其内容可以变化。
指针变量的特殊性在于保存的是变燃虚量的地址,包括但不限于:int变量的地址,数组的地址,结构体的地址,指针变量的地址。。。
结合你的例子:
p的内容变为a的地址,123h,p的地址不会变
*p 的亮段败值就是a的值,是1
p本敬颤身也有地址,它的地址和a的地址不同,是321h
地址和值其实很好区分,地址的意思是上哪找到它,值的意思就是它里面保存了什么。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
在沙漠考察古迹的凤凰木
2019-05-18 · TA获得超过155个赞
知道答主
回答量:312
采纳率:13%
帮助的人:32.6万
展开全部
这是指针的问题吧。一般定义指针是 int *p
给指芦兄裂针p赋一个初值,那么p就代表这个值的地址陪闭,尘扰*p就是这个值的数值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式