在C/C++中,给指针赋值时,int *P=&a;和int *P;P=&a;是否一样?
3个回答
展开全部
你说“可是前者访问*P就相当于a,但却是a的地址,这不是矛盾吗?”,是因为你不明白*p的多义性,举两个例子你就知道了:int
*p;这是定义一个指针变量,应该把他看作(int
*)p;其中(int
*)跟int一样,也看作是一种类型:指向实型数的指针型。
而对于
int
*p=&a;
int
b;
*p=b;在这里,*p相当于(*p),“
*
”是取内容运算符。
好好看书吧,这都是书上的细节部分,要想学得好,要靠记得牢。
*p;这是定义一个指针变量,应该把他看作(int
*)p;其中(int
*)跟int一样,也看作是一种类型:指向实型数的指针型。
而对于
int
*p=&a;
int
b;
*p=b;在这里,*p相当于(*p),“
*
”是取内容运算符。
好好看书吧,这都是书上的细节部分,要想学得好,要靠记得牢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一
问题补充:还有
定义一个指针要确定它指向数据的类型
比如
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个字节
以上是我的回答
如果有什么不正确的地方
还请指出
谢谢
问题补充:还有
定义一个指针要确定它指向数据的类型
比如
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个字节
以上是我的回答
如果有什么不正确的地方
还请指出
谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询