C中的数组是指针的语法糖吗?

Dav*_*vid 3 c syntactic-sugar

我们来看看下面的代码:

int arr[n];
// s.t. i<n
arr[i] = 12;
// s.t. i<n 
*(arr + i) = 12;
Run Code Online (Sandbox Code Playgroud)

arr[i]一种合成糖*(arr+ i)吗?

use*_*738 6

是的,您可以说 - 数组下标访问与使用*解除引用的指针访问相同.

6.5.2.1p2 C11标准N1570

后缀表达式后跟方括号中的表达式[]是数组对象元素的下标名称.下标操作符的定义[]E1[E2]相同(*((E1)+(E2))).由于适用于二元+运算符的转换规则,if E1是一个数组对象(等效地,指向数组对象的初始元素的指针)并且E2是一个整数,因此E1[E2]指定E2-th元素E1(从零开始计数).

绝不应该给你一个数组是指针的印象.有趣的是,当您将[]数组衰减应用于指向第一个元素的指针并且用于访问后续元素时.

数组对象是另一回事 - 有些情况下数组不会衰减为指针.它们不是语法糖 - 你可以考虑一个例子 -

int p[] = {1, 2 ,3};
int *t = p;
size_t sz1 = sizeof p;
size_t sz2 = sizeof t;
printf("%zu %zu\n", sz1, sz2);
Run Code Online (Sandbox Code Playgroud)

运行此操作,我将了解与您的问题更相关的内容.使用阵列本身以外的其他东西无法实现数组.数组访问与指针取消引用相同,但这并不意味着指针占据数组的位置,反之亦然.

C编程的关键外卖或红色药丸:

数组是数组,指针是指针.他们是不同的东西.


顺便说一句,如果sizeof欺骗了你一点 - 不要担心有一个标准部分说.从6.3.2.1p3开始

除非它是运算sizeof,_Alignof运算符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则将具有类型'array of type'的表达式转换为具有'pointer to type'指向数组的初始元素的类型的表达式对象并不是左值...

当用作操作数时,数组不会转换为指针sizeof.那是事情.这就是为什么你得到你在早期代码片段中得到的东西.


Ger*_*rdh 5

是的,与哪个相同,与arr[i]哪个相同*(arr+i)*(i+arr)i[arr]

来自 Fabio Turati 的评论:有关更多详细信息,请参阅“为什么 a[5] == 5[a]” 。