为什么下述C++程序输出值为8?请解释相关指针转换与运算逻辑
问题解释:C++二维数组强制转二级指针输出结果分析
首先给出运行的代码:
#include <iostream> using namespace std; int main() { int a[2][3] = { {4,3, 7},{2,6, 9} }; int** b = (int**)a; cout << *b + 1 << endl; }
注意:以下解释仅针对int占4字节、指针大小等于int大小的32位主流编译环境,这段代码本身违反C++类型别名规则,属于未定义行为,不同环境下运行结果可能完全不同,实际开发中禁止使用此类错误的强制类型转换写法。
- 第一步:明确二维数组的内存布局。
int a[2][3]是连续存储的一块内存,元素按顺序依次为4、3、7、2、6、9,每个int占4字节,数组首地址a指向的就是存储数值4的内存位置。 - 第二步:理解强制转换的作用。原
a的类型是数组指针int(*)[3],你将它强制转换为int**赋值给b,此时b的取值就是数组a的首地址。 - 第三步:解引用
*b的逻辑。b是二级指针,对b解引用的操作,本质是把b指向的内存区域里的内容,当作一个int*类型的指针读取。刚好b指向的位置存的是int类型的数值4,所以读出来的*b值就是4,类型为int*。 - 第四步:指针加法的计算规则。指针加法的计算逻辑为
指针值 + 偏移量 * 指向类型的字节大小,*b的指向类型是int,占4字节,因此*b + 1的结果就是4 + 1*4 = 8,也就是你看到的输出。
你的推测*b + x等价于数组a首元素值加x*4,在当前运行环境下的表现刚好符合,但本质原因并不是合法的数组偏移,而是错误的强制类型转换导致数组元素值被当作指针参与了运算。
内容的提问来源于stack exchange,提问作者Luka Tokmacic
相关产品推荐
相关产品推荐

