C语言中指针自增为何增加指向类型大小而非1字节?
这是个特别典型的C语言指针核心问题,很多刚接触指针的朋友都会有这个疑惑,我来给你讲清楚背后的逻辑:
指针算术的设计目标是指向同类型的下一个元素
C语言里的指针不是单纯的内存地址数字,它是带“类型信息”的。当你声明int* ptr时,编译器就知道这个指针是用来指向int类型对象的。所以指针的自增(ptr++)、自减或者加减整数这类运算,本质是帮你移动到下一个/上一个同类型的元素,而不是随便移动1个字节。结合你的代码来看
你的数组a里的两个int元素在内存里是连续存放的(假设int占4字节):地址: 0x100 0x104 值: 1 2初始时
ptr指向0x100,*ptr输出1。执行ptr++后,编译器自动把指针地址加上sizeof(int)(也就是4),让它跳到0x104,正好指向第二个int元素,所以*ptr输出2。如果想让指针移动1字节怎么办?
如果你确实需要让指针只移动1个字节,得先把指针转换成char*类型(因为char的大小标准是1字节):char* char_ptr = (char*)ptr; char_ptr++; // 现在指针移动了1字节,指向两个int的中间位置但要注意:这时候去解引用
*char_ptr的话,拿到的只是int对象的一部分字节,这种操作属于未定义行为,结果是不确定的(可能输出乱码,甚至程序崩溃),实际开发中除非你在做内存操作的底层hack,否则不要这么干。为什么要这么设计?
这种设计是为了让数组和指针的交互更自然。你应该知道a[i]等价于*(a + i)吧?这里的i就是按sizeof(int)来计算偏移的,这样才能正确访问数组的第i个元素,这是C语言数组访问的底层逻辑。要是指针每次只移动1字节,那你访问数组元素就得自己算字节数,太麻烦了~
内容的提问来源于stack exchange,提问作者Luca S.

