在C/C++中,给指针赋值时,int *P=&a;和int *P;P=&a;是否一样?

 我来答
台藻赵玥
2019-03-30 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:32%
帮助的人:641万
展开全部
都是定义了一个指针变量,然后把a的地址复制给这个指针变量,效果基本是一样的。
稍微的区别是,一个是直接赋值,一个是先定义,后赋值。区别在于,第二种先定义,后赋值的情况,如果定义与赋值间还有其他代码,那么P指向的地址是未知的,所以使用的话会有未知行为。
如果定义与赋值是连续的语句,那么上述两个内容就完全一样了。
乘辰铭苑司
游戏玩家

2019-06-02 · 游戏我都懂点儿,问我就对了
知道大有可为答主
回答量:9862
采纳率:33%
帮助的人:700万
展开全部
你说“可是前者访问*P就相当于a,但却是a的地址,这不是矛盾吗?”,是因为你不明白*p的多义性,举两个例子你就知道了:int
*p;这是定义一个指针变量,应该把他看作(int
*)p;其中(int
*)跟int一样,也看作是一种类型:指向实型数的指针型。
而对于
int
*p=&a;
int
b;
*p=b;在这里,*p相当于(*p),“
*
”是取内容运算符。
好好看书吧,这都是书上的细节部分,要想学得好,要靠记得牢。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
卜夏兰柴菁
2019-11-27 · TA获得超过3万个赞
知道小有建树答主
回答量:1.1万
采纳率:34%
帮助的人:650万
展开全部

问题补充:还有
定义一个指针要确定它指向数据的类型
比如
int
*P
;p指向的数据类型只能是int型;
那是为什么呢?
因为程序运行执行某种操作的时候需要知道指针的类型
比如
int
a[10];
int
*p
=
a;
现在p指向数组的首地址
假设这个地址是0x00000000
那么*p
=
a[0]
那么怎么指向a[1]呢?执行p
=
p+1后
*p=a[1]了
请注意
p=p+1不是
0x00000000+1而是0x00000000+4(在32位的机器上)
为什么是加4而不是加1
因为int型在32位机器上是占四个字节
所以指向下一个数组元素的地址就需要把地址移动四个字节
这就是指针需要类型的原因
如果指针是
char类型
那么p=p+1地址就移动一个字节
我的表达能力不太好
不知道你能不能明白

int
a;
char
*p;
a=4;/*输出的值是否相等取决于此处的赋值范围*/
p=&a;
printf("%d\n",a);
printf("%d\n",*p);
如果a在-128~128间输出都是相等的
超出范围后就不一样了.
这个就像我上面说的
如果是char型
那么printf函数从指针开始读取1个字节输出,如果是int型
那么printf函数从指针开始读取四个字节
a
=
4
在内存中存储的为
0x04
0x00
0x00
0x00
(intel的CPU应该是这样存储的
不同的cpu是不一样的好像
地址依次增加)
所以当当a在-128~128时
printf("%d\n",a);
printf("%d\n",*p);
都输出0x04
(从指针开始读取一个字节和4个字节是一样的)
如果a大于128
比如在内存中存储的为
0x04
0xFF
0x00
0x00
这样printf("%d\n",*p);
就只读取了
0x04
,0xFF被抛弃了
所以就不一样了
好像是这个样子的

指针只存放一个地址而已,难道不同数据类型的地址长度什么的都不一样吗?
地址长度是一样的
sizeof(int
*)

sizeof(char*)在32位机器都是4个字节
以上是我的回答
如果有什么不正确的地方
还请指出
谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式