我正在准备一些演示文稿,我很好奇是否有任何其他上下文(sizeof除外),其中数组类型的变量给出的行为与指向数组的第一个元素的指针不同。我的意思是:
int a[5];
int *p = a;
printf("%d %d\n", sizeof(a), sizeof(p));
打印两个不同的数字。还有其他类似的情况,无论我使用数组还是指针都很重要?
答案 0 :(得分:8)
是否存在数组未转换为指针的情况,除了sizeof?
从C99 / C11,第6.3.2.1节:
除非它是
sizeof
运算符,[_Alignof
运算符]或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,具有“数组类型”类型的表达式将转换为类型为“指向类型的指针”的表达式...
请注意,_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
答案 1 :(得分:4)
还有一件事。
int a[10];
int *pa;
数组名称和必须指针之间存在一个区别 请记住。指针是一个变量,因此pa = a和pa ++是合法的。 但是数组名称不是变量;像a = pa和++这样的结构 是非法的。
C编程语言,Dennis M. Ritchie
答案 2 :(得分:3)
如果我们查看draft C99 standard部分&
Lvalues,数组和函数指示符,那么还有其他一些未转换的上下文,例如一元6.3.2.1
。 / em>段落 3 它说:
除非它是sizeof运算符或一元&的操作数。运营商,或者是 用于初始化数组的字符串文字,类型为''数组类型'的表达式是 转换为类型为''指向类型'的指针的表达式,指向的初始元素 数组对象并不是左值。