在您看来,您遇到的最令人惊讶,奇怪,奇怪或真正的"WTF"语言功能是什么?
每个答案只能有一个功能.
当我需要将一个数组传递给一个函数时,似乎所有以下函数声明都可以工作
void f(int arr[])
void f(int arr[4]) // is this one correct?
Run Code Online (Sandbox Code Playgroud)
为了这:
int a[]={1,2,3,4};
f(a);
Run Code Online (Sandbox Code Playgroud)
但是当我将一个数组分配给另一个数组时,它就失败了
int a[]={1,2,3,4};
int b[4] = a; // error: array must be initialized with a brace-enclosed initializer
Run Code Online (Sandbox Code Playgroud)
那么为什么作为函数的参数传递的数组是可以的,但是在简单赋值的rhs上使用是错误的?
请考虑以下陈述:
int *pFarr, *pVarr;
int farr[3] = {11,22,33};
int varr[3] = {7,8,9};
pFarr = &(farr[0]);
pVarr = varr;
Run Code Online (Sandbox Code Playgroud)
在这个阶段,两个指针都指向每个相应阵列地址的开头.对于*pFarr,我们目前正在考虑11和*pVarr,7.
同样,如果我通过*farr和*varr请求每个数组的内容,我也得到11和7.
到现在为止还挺好.
现在,让我们尝试pFarr++和pVarr++.大.正如预期的那样,我们现在看22和8.
但现在...
试图拉升farr++和varr++...我们得到"错误类型的参数来增加".
现在,我认识到数组指针和常规指针之间的区别,但由于它们的行为相似,为什么会出现这种限制呢?
当我还考虑在同一个程序中我可以用表面上正确的方式和另一种不正确的方式调用以下函数时,这让我更加困惑,我得到了相同的行为,尽管与上面发布的代码中发生的情况形成对比!?
working_on_pointers ( pFarr, farr ); // calling with expected parameters
working_on_pointers ( farr, pFarr ); // calling with inverted parameters
Run Code Online (Sandbox Code Playgroud)
.
void working_on_pointers ( int *pExpect, int aExpect[] ) {
printf("%i", *pExpect); // displays the contents of pExpect ok
printf("%i", *aExpect); // displays the contents of …Run Code Online (Sandbox Code Playgroud) 由于 sizeof 运算符评估操作数是否为 VLA,因此我尝试将其测试为:
#include<stdio.h>
int main(void)
{
int sz=20,i=0,j=0;
int arr[sz];
printf("%d\n",sizeof((++i,sz)));
printf("%d\n",sizeof((++j,arr)));
printf("%d\n%d\n",i,j);
}
Run Code Online (Sandbox Code Playgroud)
我认为我不会增加,因为 sz 不是 VLA,但 j 会增加,因为 arr 是 VLA。
但是在输出中, i 和 j 都没有增加。