为何int*自增偏移4字节,int**/int***自增偏移8字节?
指针自增偏移量差异解析
测试代码
void intArrayAsPointerPrinter(int iSize){ int * p = 0; int ** q = 0; int *** r = 0; for(int i = 0; i < iSize; i++) { printf("%p %p %p\n", p,q,r); p++; q++; r++; } }
调用输出(传入size=3)
0x0 0x0 0x0 0x4 0x8 0x8 0x8 0x10 0x10
问题解答
指针自增的偏移量根本不是看指针自身的大小,而是由它指向的数据类型的大小决定,这是C语言的核心规则:
int* p:指向的是int类型,你当前环境中int占4字节,所以p++会让地址偏移4字节,确保下一次能精准指向相邻的下一个int变量。int** q:指向的是int*类型(也就是一个指针),你使用的是64位系统,指针类型本身占8字节,因此q++需要偏移8字节,才能指向相邻的下一个int*指针变量。int*** r:指向的是int**类型(同样是指针),大小也是8字节,所以r++的偏移量同样是8字节。
你觉得“所有指针自增偏移应该统一”是对指针自增逻辑的误解——指针自增的本质是移动到下一个同类型元素的起始地址,因此偏移量必须匹配它指向的类型的大小,而非指针自身的大小。
内容的提问来源于stack exchange,提问作者Alex Wang
相关产品推荐
相关产品推荐

