当调用int* 指针时,[]会做什么?
例如,在此代码中:
int* someIntPointer = 4000; //pointer points to byte 4000 in memory
++someIntPointer; //pointer points to byte 4004 in memory
someIntPointer[5]; //What memory spot does someIntPointer point to now?
在char* 上调用时有什么不同吗?
在我看来,在指针上调用eg [5]会使指针增加5,因此它指向更高的内存点(5 * 数据类型的字节大小),例如,对于int_32,是20(5*4)。这是正确的吗?
问候和感谢任何答案
2条答案
按热度按时间wqsoz72f1#
应用于指针
pointer[index]
,它完全等同于(因此语法糖)*(pointer + index)
指向的类型在这方面是无关紧要的-除了 * 字节 * 的距离是(通常)不同(
(uintptr_t)&charPtr[1] - (uintptr_t)&charPtr[0]
-总是1,而int
指针的类似差异是sizeof(int)
-通常但不一定是4)。(即指向的类型)对于相邻元素保持1,即独立于类型&pointer[1] - &pointer[0] == 1
(注意缺失的转换为uintptr_t
)。实际上,你甚至根本不需要一个显式的数组索引操作符;将指针索引操作符应用于数组将导致数组衰减为指针。如果C标准确实依赖于或仍然单独定义数组索引操作符,我(目前)不知道,尽管...
附注/有趣的事实:
上面的等价性导致等价于
*(index + pointer)
,最后等价于index[pointer]
,使得看起来很奇怪的7[pointer /* or array*/]
有效代码做同样的事情。polkgigr2#
是的,这正是它的处理方式,所以你可以很容易地(在某些方面)将指针用作指针指向的任何类型的数组。
编辑:正如阿空加瓜在评论中提到的:
对于著名的
sizeof
来说,使用pointer as an array
会失败-技巧(sizeof(array)/sizeof(*array)