c# 在C中,当对指针调用[]时,[]会做什么?

vyswwuz2  于 2023-04-27  发布在  C#
关注(0)|答案(2)|浏览(151)

当调用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)。这是正确的吗?
问候和感谢任何答案

wqsoz72f

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*/]有效代码做同样的事情。

polkgigr

polkgigr2#

是的,这正是它的处理方式,所以你可以很容易地(在某些方面)将指针用作指针指向的任何类型的数组。
编辑:正如阿空加瓜在评论中提到的:
对于著名的sizeof来说,使用pointer as an array会失败-技巧(sizeof(array)/sizeof(*array)

相关问题