一道有趣的题!

tengxiaoming 2010-03-18 11:13:06
int a[] = {1,2,3,5,9};

int *pstr1 = (int *)(&a +1);
int *pstr2 = (int *)((int)a +1);

*pstr1 = ?
*pstr2 = ?

为什么?
...全文
276 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
机智的呆呆 2010-03-18
  • 打赏
  • 举报
回复
pstr1[-1] = ?在编译里解析成*(pstr1-1),显然指向了a[4]位置,
推广来看pstr1[n]和*(pstr1+n)和n[pstr1],在编译器眼里都是一样的,n可以为负数

pstr2[2]=>*(pstr2+2),指向了上面的0x00ff0009位置,0x00ff0008~0x00ff000b是a[2]存储地址里数据分别是0x03,0x00,0x00,0x00,0x00ff00c~0x00ff000f里数据0x05,0x00,0x00,0x00,
可以知道pstr2[2]值为0x05000000

以上分析 基于小端架构分析~~~
tan870426 2010-03-18
  • 打赏
  • 举报
回复
这种题目真的很没意义!
了解就好!
tan870426 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tengxiaoming 的回复:]
不好意思各位.
问错了。
我想问的是:
pstr1[-1] = ?
pstr2[2] = ?
为什么?
[/Quote]pstr1[-1]应该是指向数组a的最后一个,也就是9,具体操作解释见6L
pstr2是a的首地址后移一个字节,也就错位了,所以pstr2[2]打印的指应该是a[2]的后三个字节跟a[3]的第一个字节这四个字节组成的整形值,肯定是无意义的乱码~!
机智的呆呆 2010-03-18
  • 打赏
  • 举报
回复

int a[] = {1,2,3,5,9};

int *pstr1 = (int *)(&a +1);
int *pstr2 = (int *)((int)a +1);

a默认被解析成一个int *变量的值,&a则被解析成一个int(*)[5]的指针,所以导致&a +1进行指针运算时,&a +1值是(int)&a+sizeof(int [5),指针运算时的偏移实际是偏移*sizeof(指针指向的类型),所以此时pstr1 指向了
数组a对应的分配内存的下个内存单位,即a[5]位置属于越界位置,所以*pstr1值取决于a[5]上次被操作后遗留的值,可以认为是随机的。
((int)a +1)指针运算时由于是以int进行运算所以pstr2值是从a的值偏移一个字节。
假设a的值是0x00ff0000,则此时的pstr2值为0x00ff0001,0x00ff0000~0x00ff0003四个字节内存是a[0]对应的内存,由于写入1,则按照小端存在,0x00ff0000~0x00ff0003四个字节内存里分别存储0x01,0x00,0x00,0x00,同理a[1]对应的0x00ff0004~0x00ff0007四个字节里内存为0x02,0x00,0x00,0x00,当对pstr2解引用时,会从0x00ff0001开始内存 往下涵盖4个字节,把里面的数据
按照int数据组织方式取出,实际是0x02000000,值为33554432
tengxiaoming 2010-03-18
  • 打赏
  • 举报
回复
不好意思各位.
问错了。
我想问的是:
pstr1[-1] = ?
pstr2[2] = ?
为什么?
至善者善之敌 2010-03-18
  • 打赏
  • 举报
回复
(int *)关键是这个,强制转换成指针也就是地址,所以*pstr1取的内容是内存中不确定的地址,明白否?
_JeffreyWu 2010-03-18
  • 打赏
  • 举报
回复
无意义,顺便BS一下楼主结帖率
haierpro 2010-03-18
  • 打赏
  • 举报
回复
*pstr1 = 2
*pstr2 = 33554432

猜的,楼主可以试一试。
tan870426 2010-03-18
  • 打赏
  • 举报
回复

&a的解释不准确
pstr1应该是指向a数组的下一位,越界了...(&a +1)表示从数组a的位置后移sizeof(a)个字节...
冻结 2010-03-18
  • 打赏
  • 举报
回复

int main()
{
int a[] = {1,2,3,5,9};

int *pstr1 = (int *)(&a +1);
int *pstr2 = (int *)((int)a +1);

cout<<(int)*pstr1<<" "<<(int)*pstr2<<endl;
return 0;
}

结果:
-858993460 33554432
请按任意键继续. . .
tan870426 2010-03-18
  • 打赏
  • 举报
回复
a表示数组的首地址,指针
&a表示保存数组首地址的地址,指针的指针
然后去分析一下两个语句就好了
这样的结果没什么实际意义的...
完全是为了出题而出题
鄙视这种笔试题目
冻结 2010-03-18
  • 打赏
  • 举报
回复
int *pstr2 = (int *)((int)a +1);
这句没这么用的。
SiGoYi 2010-03-18
  • 打赏
  • 举报
回复
都是不确定的值,都是地址。
冻结 2010-03-18
  • 打赏
  • 举报
回复
*pstr1 = 2
*pstr2 = 128

猜的,楼主可以试一试。


tutu08 2010-03-18
  • 打赏
  • 举报
回复
指针啊...
zwlzhj 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 demon__hunter 的回复:]
C/C++ code

int a[] = {1,2,3,5,9};

int *pstr1 = (int *)(&a +1);
int *pstr2 = (int *)((int)a +1);


a默认被解析成一个int *变量的值,&a则被解析成一个int(*)[5]的指针,所以导致&a +1进行指针运算时,&a +1值是(int)&a……
[/Quote]
正解
cy330206 2010-03-18
  • 打赏
  • 举报
回复
更具指针和数组变量之间的关系我们可以知道如果在表达式中仅出现a即是取数组成员a[0]的地址, 如果出现 &a 则是取一维数组的末位接下来的地址,如果是二维数组则是取第二行的首元素的地址。

楼主这个题目很经典的,,去c版块去搜搜有很多的
aimsam 2010-03-18
  • 打赏
  • 举报
回复
应该是都不确定吧?最后的数值和一开始的赋值都没关系了,开始的赋值都变成了地址。地址里有什么天知道
赵4老师 2010-03-18
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧