将数组表示法转换为指针表示法

标签 c arrays pointer-arithmetic

int  array[5];

表达式如

 array[3] gets converted to *(array+3)

或者在

void fun ( int *array[] );

*array[] gets converted to int **array 

我想知道数组声明是什么

int array[5]; 

转换为?是吗

int *(array+5)

如果是,这意味着什么?人们如何解释和/或阅读它?

最佳答案

  • array[i] gets converted to *(array+i)

    正确,鉴于 array[i]expression 的一部分,然后 array“衰减”为指向其第一个元素的指针,这就是上述内容成立的原因。

  • Void fun ( Int *array[] );
    *array[] gets converted to Int **array

    是的,因为函数参数调整(“衰减”)的规则,类似于表达式中的数组衰减。该数组的第一项是一个 int*,所以在衰减之后,您最终得到一个指向这种类型的指针,一个 int**

    这仅适用于具有您发布的特定格式的函数,否则指针到指针和数组之间没有任何关系。

  • I was wondering what does the array declaration

    Int array[5];
    Get converted to?

    没有,声明不会被转换。它是一个包含 5 个整数的数组。


总而言之,您实际上列出了 3 种不同的情况。

  • 当数组用作表达式的一部分时,它“退化”为指向第一个元素的指针。
  • 当数组用作函数参数声明的一部分时,它也会“衰减”——实际上它的类型在编译时被编译器替换——变成指向第一个元素的指针。 C 有意这样设计,以便函数可以与表达式中使用的数组一起工作。
  • 正常声明数组(不是参数列表的一部分)时,除了获得指定大小的数组外,什么也不会发生。

关于将数组表示法转换为指针表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43864364/

相关文章:

javascript - 如何在 ReactJS 中将列表中的值存储到对象数组中

c - `*((char*)ptr+4))` 在做什么?

C:将 uint8 数组转换为包含其字节的十六进制表示形式的字符串

javascript - 尝试使用reduce在Javascript中添加路由父URL

c - DTS 和 PTS 不同,尽管没有 B 帧 (ffmpeg)

java - 反转数组的递归方法的时间复杂度

c - 为什么在更改 main 的签名时会出现段错误?

C指针运算

c - 从 UART 读取数据时停止程序

c - 读取一串预期模式