下面程序中,如果语句 cout<<p<<endl; 输出的是 0x6ffe00,则 cout<<++p<<endl; 输出的是( )
int x[10][10][10]={{0}};
int *p;
p=&x[0][0][0];
cout<<p<<endl;
cout<<++p<<endl;答案D。二进制转十进制:整数部分按权展开,小数部分乘以2的负幂次。
二进制小数转十进制:小数点后第一位是2⁻¹=0.5,第二位是2⁻²=0.25。容易忽略负幂次。
【考点】指针算术|多维数组内存布局|sizeof
这题考的是指针自增的底层含义。**p 是 int* 类型**,++p 不是"地址+1",而是"地址+sizeof(int)"——这是指针算术的通性,任何指针类型都遵循。
初始 p=&x[0][0][0] 指向第一个 int,输出 0x6ffe00 说明这个位置刚好落在 4 字节边界上(3D 数组在内存里是连续存放的,每个 int 占 4 字节)。++p 后 p 移到下一个 int 位置,地址就是 0x6ffe00+4=0x6ffe04,对应选项 D。
命题人套路:故意用多维数组迷惑人,其实只要聚焦"p 是 int*,++p 加几个字节"就能秒杀。那阴险细节在于——它没问 p 值变化,而是问地址变化,如果你把++p 当成"值加1"就会选 A(0x6ffe0c 是加了 12,以为是 x[0][0][3] 的地址)。
反命题视角:把++p 改成 p+=2 答案还是 D;把 p 改成 char* 则++p 只加 1 字节。这类题本质都在考"指针类型决定步长",下次刷到先问自己:p 是什么类型?++p 加几个字节?