C 是否存在数组未转换为指针(sizeof除外)的情况?
我正在准备一些演示文稿,我很好奇是否还有其他上下文(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运算符、]或一元&运算
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:第二部分现在已重新编写。。。