我们来看看下面的代码:
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)吗?
是的,您可以说 - 数组下标访问与使用*解除引用的指针访问相同.
从6.5.2.1p2 C11标准N1570
后缀表达式后跟方括号中的表达式
[]是数组对象元素的下标名称.下标操作符的定义[]是E1[E2]相同(*((E1)+(E2))).由于适用于二元+运算符的转换规则,ifE1是一个数组对象(等效地,指向数组对象的初始元素的指针)并且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.那是事情.这就是为什么你得到你在早期代码片段中得到的东西.