C 11代码:
int a[3]; auto b = a; // b is of type int* auto c = &a; // c is of type int(*)[1]
C代码:
int a[3]; int *b = a; int (*c)[3] = &a;
b和c的值相同.
b和c有什么区别?为什么他们不是同一类型?
更新:我将数组大小从1更改为3.
解决方法
对于一个,sizeof运算符的行为应该不同,特别是如果将a的声明更改为不同的整数,例如int a [7]:
int main() { int a[7]; auto b = a; auto c = &a; std::cout << sizeof(*b) << std::endl; // outputs sizeof(int) std::cout << sizeof(*c) << std::endl; // outputs sizeof(int[7]) return 0; }
对我来说,这打印:
4 28
那是因为两个指针的类型非常不同.一个是指向整数的指针,另一个是指向7个整数数组的指针.
第二个确实有指针到数组类型.如果你取消引用它,当然,它在大多数情况下都是decay to a pointer,但它实际上并不是指向int的指针.第一个是指向int的指针,因为在赋值时发生了衰变.
它会显示的其他地方是,如果你确实有两个指针到数组类型的变量,并试图将一个变量分配给另一个:
int main() { int a[7]; int b[9]; auto aa = &a; auto bb = &b; aa = bb; return 0; }
这让我收到错误信息:
xx.cpp: In function ‘int main()’: xx.cpp:14:8: error: cannot convert ‘int (*)[9]’ to ‘int (*)[7]’ in assignment aa = bb;
但是,这个例子有效,因为解除引用bb允许它衰减到指向int的指针:
int main() { int a; int b[9]; auto aa = &a; auto bb = &b; aa = *bb; return 0; }
请注意,衰减不会发生在作业的左侧.这不起作用:
int main() { int a[7]; int b[9]; auto aa = &a; auto bb = &b; *aa = *bb; return 0; }
它赢得了这个:
xx2.cpp: In function ‘int main()’: xx2.cpp:14:9: error: incompatible types in assignment of ‘int [9]’ to ‘int [7]’ *aa = *bb;