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

时间:2017-05-09 08:03:52

标签: 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)

如果是,这甚至意味着什么?如何解读和/或阅读它?

2 个答案:

答案 0 :(得分:5)

  •   

    array [i]转换为*(array + i)

    正确,假设array[i]表达式的一部分,那么array“衰变”成指向其第一个元素的指针,这就是为什么上述成立的原因。

  •   

    Void fun(Int * array []);
      * array []转换为Int ** array

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

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

  •   

    我想知道数组声明是什么

         

    Int array [5];
      转换成?

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

总结一下,你实际列出了3种不同的情况。

  • 当数组用作表达式的一部分时,它会“衰减”为指向第一个元素的指针。
  • 当一个数组用作函数参数声明的一部分时,它也“衰减” - 它实际上在编译时将其类型替换为编译器 - 转换为指向第一个元素的指针。 C是故意以这种方式设计的,因此函数可以与表达式中使用的数组一起使用。
  • 当一个数组被正常声明时(不是参数列表的一部分),除了你得到一个指定大小的数组之外什么也没发生。

答案 1 :(得分:0)

我认为你混淆了两件事。

*(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");