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

Converting array notation to pointer notation

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)

如果是,这到底是什么意思?如何解读它 and/or 阅读它?

我认为你混淆了两件事。

*(array+i)

不能用于声明,只能用于访问内存位置(数组是起始地址,i是偏移量)

此外,以下声明将在堆栈上创建一个包含 5 个整数的数组

int array[5]; 

您可以使用其他表示法访问数组中的任何元素,因为值被压入堆栈。以下两个产生相同的结果:

int a = *(array+3);
int b = array[3];
if (a == b) printf("Same value");
else printf("Not same value");
  • array[i] gets converted to *(array+i)

    正确,鉴于 array[i] 表达式 的一部分,然后 array "decays" 指向其第一个元素的指针,这这就是为什么上述成立。

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

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

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

  • I was wondering what does the array declaration

    Int array[5];
    Get converted to?

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


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

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