Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否存在数组未转换为指针(sizeof除外)的情况?_C - Fatal编程技术网

C 是否存在数组未转换为指针(sizeof除外)的情况?

C 是否存在数组未转换为指针(sizeof除外)的情况?,c,C,我正在准备一些演示文稿,我很好奇是否还有其他上下文(sizeof除外),其中数组类型的变量给出的行为与指向数组第一个元素的指针不同。我的意思是: int a[5]; int *p = a; printf("%d %d\n", sizeof(a), sizeof(p)); 打印两个不同的数字。是否有其他类似的情况影响我使用数组还是指针 是否存在数组未转换为指针(sizeof除外)的情况 根据C99/C11第6.3.2.1节: 除非它是sizeof运算符、\u Alignof运算符、]或一元&运算

我正在准备一些演示文稿,我很好奇是否还有其他上下文(sizeof除外),其中数组类型的变量给出的行为与指向数组第一个元素的指针不同。我的意思是:

int a[5];
int *p = a;
printf("%d %d\n", sizeof(a), sizeof(p));
打印两个不同的数字。是否有其他类似的情况影响我使用数组还是指针

是否存在数组未转换为指针(sizeof除外)的情况

根据C99/C11第6.3.2.1节:

除非它是
sizeof
运算符、
\u Alignof
运算符、]或一元
&
运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“array of type”的表达式将转换为类型为“pointer to type”的表达式

请注意,
\u Alignof
仅在C11中


是否有其他类似的情况影响我使用数组还是指针

上面的规则解释了数组和指针的所有行为。然而,它描述的转换有几个不太明显的含义

例如,这不会编译:

void foo(int **a) { }

int b[5][10];

foo(b);  // Compilation error; b becomes &b[0], which is pointer type,
         // and thus doesn't then become &&b[0][0]
这也不是:

int a[5];
int b[5];

a = b;   // Compilation error; a becomes &a[0], which isn't an lvalue

如果我们看一下第6.3.2.1节“左值、数组和函数指示符”第3段,则有一些其他上下文未进行转换,例如一元
&

除非它是sizeof运算符或一元&运算符的操作数,或是 字符串文字用于初始化数组,类型为“”的数组类型“”的表达式为 已转换为类型为“指向类型的指针”且指向的初始元素的表达式 数组对象,并且不是左值

还有一件事

int a[10];
int *pa;
数组名和指针之间有一个区别,必须 记住。指针是一个变量,因此pa=A和pa++是合法的。 但是数组名不是一个变量;像a=pa和a这样的结构++ 这是违法的


答案的第二部分是C语言Dennis M.Ritchie

,它没有回答这个问题,更像是一种干扰。最多应该是一些评论。第一部分不完整,更改为C11,将
\u Alignof
运算符添加到您引用的文本中。@JensGustedt:第二部分现在已重新编写。。。