C语言中*(pointerFunc + i)指针操作的原理及执行过程问询
int * func() { static int array[10]; int i = 0; while(i<10){ array[i] = i + 1; i++; } return array; } int main() { int *pointerFunc; pointerFunc = func(); for (int i = 0; i < 10; i++ ) { printf("*(pointerFunc[%d]) : %d\n", i, *(pointerFunc + i)); } return 0; }
我编写了一个创建数组的函数,在main函数中想要打印该数组的所有元素,于是使用指针获取函数内数组的访问权限。代码可正常运行,但我无法理解其中的指针操作逻辑,具体想知道printf语句中的*(pointerFunc + i)如何工作?它能打印数组所有元素,但我不清楚原理,也想知道此时指针的指向是什么。
1. pointerFunc的指向
func里的array是static修饰的数组,它存在静态存储区,不会随函数执行结束被销毁。return array返回的是这个数组的首元素地址(即&array[0]),所以main中的pointerFunc最终指向array数组第一个元素的内存地址。
2. *(pointerFunc + i)的工作原理
这是C语言指针算术运算的核心逻辑:
- 指针加法不是数值累加:
pointerFunc是int*类型,执行pointerFunc + i时,编译器会自动计算偏移量:i * sizeof(int)。比如int占4字节的话,pointerFunc + 1会向后跳4字节,正好指向数组的下一个元素。 pointerFunc + i等价于&array[i],也就是数组第i个元素的内存地址。- 前缀的
*是解引用操作,作用是读取该地址上存储的数值,也就是array[i]的值。
额外补充:语法等价性
C语言中,数组下标语法pointerFunc[i]就是*(pointerFunc + i)的语法糖,两者完全等价。你代码里printf的第一个参数*(pointerFunc[%d])是多余的——pointerFunc[i]已经是数值,再解引用会触发编译警告,改成pointerFunc[%d]或者*(pointerFunc + %d)才是正确写法。
内容的提问来源于stack exchange,提问作者Reise Thomas Kato
相关产品推荐
相关产品推荐

