Dom*_*omi 6 c c++ arrays pointers auto
C++ 11代码:
int a[3];
auto b = a; // b is of type int*
auto c = &a; // c is of type int(*)[1]
Run Code Online (Sandbox Code Playgroud)
C代码:
int a[3];
int *b = a;
int (*c)[3] = &a;
Run Code Online (Sandbox Code Playgroud)
的价值观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;
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这打印:
4
28
Run Code Online (Sandbox Code Playgroud)
那是因为两个指针的类型非常不同.一个是指向整数的指针,另一个是指向7个整数数组的指针.
第二个确实有指针到数组类型.如果你取消引用它,当然,在大多数情况下它会衰减到指针,但它实际上并不是指向int的指针.第一个是指向int的指针,因为在赋值时发生了衰变.
它会显示的其他地方是,如果你确实有两个指针到数组类型的变量,并试图将一个变量分配给另一个:
int main()
{
int a[7];
int b[9];
auto aa = &a;
auto bb = &b;
aa = bb;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这让我收到错误信息:
xx.cpp: In function ‘int main()’:
xx.cpp:14:8: error: cannot convert ‘int (*)[9]’ to ‘int (*)[7]’ in assignment
aa = bb;
Run Code Online (Sandbox Code Playgroud)
但是,此示例有效,因为解除引用bb允许它衰减到指向int的指针:
int main()
{
int a;
int b[9];
auto aa = &a;
auto bb = &b;
aa = *bb;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,衰减不会发生在作业的左侧.这不起作用:
int main()
{
int a[7];
int b[9];
auto aa = &a;
auto bb = &b;
*aa = *bb;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它赢得了这个:
xx2.cpp: In function ‘int main()’:
xx2.cpp:14:9: error: incompatible types in assignment of ‘int [9]’ to ‘int [7]’
*aa = *bb;
Run Code Online (Sandbox Code Playgroud)
C++中任何对象的标识由其类型和地址对决定.
在您的示例中,有两个不同的对象具有相同的地址:数组本身和数组的第一个元素.第一个有类型int[1],第二个有类型int.如果一个是另一个的子对象,则两个不同的对象可以具有相同的地址,如数组元素,类成员和类基础子对象的情况.
如果你写的话,你的例子会更清楚:
int a[5];
int (*ptr_to_array)[5] = &a;
int * ptr_to_array_element = &a[0];
Run Code Online (Sandbox Code Playgroud)
但是你已经利用了这样一个事实,即a数组的id-expression 衰减为指向数组第一个元素的指针,因此a具有与&a[0]上下文相同的值.
| 归档时间: |
|
| 查看次数: |
1508 次 |
| 最近记录: |