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
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 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;
sizeof
也会丢弃第二个 cout
中的 c
变量的 const
部分。这就是它们产生相同输出的原因。 - user2485710cout
行输出了两个不同的数字。const
根本没有涉及到。我无法将您的评论与我的帖子对齐。 - Joe Zvoid main(void)
时会出现的痉挛一样。而且由于我仍然需要编写C程序,至少这一部分不会对我造成实质性的伤害。此外,如果您使用一个通过#define
将main
包装在其他东西中的库(我在看你,SDL),最好小心谨慎... - Joe ZC++中,任何对象的身份由其类型和地址的配对确定。
在您的示例中,存在两个具有相同地址的不同对象:数组本身和数组的第一个元素。前者的类型为int[1]
,后者的类型为int
。如果一个对象是另一个对象的子对象,比如数组元素、类成员和类基类子对象,则两个不同的对象可以有相同的地址。
如果您将示例改为以下写法,会更加清晰:
int a[5];
int (*ptr_to_array)[5] = &a;
int * ptr_to_array_element = &a[0];
但是您利用了这样一个事实,即数组的 id-expression a
会衰减为指向数组第一个元素的指针,因此在您的上下文中,a
的值与 &a[0]
相同。
#include<stdio.h>
int main()
{
int myArray[10][10][10][10]; //A 4 Dimentional array;
//THESE WILL ALL PRINT THE SAME VALUE
printf("%d, %d, %d, %d, %d\n",
myArray,
myArray[0],
myArray[0][0],
myArray[0][0][0],
&myArray[0][0][0][0]
);
//NOW SEE WHAT VALUES YOU GET AFTER ADDING 1 TO EACH OF THESE POINTERS
printf("%d, %d, %d, %d, %d\n",
myArray+1,
myArray[0]+1,
myArray[0][0]+1,
myArray[0][0][0]+1,
&myArray[0][0][0][0]+1
);
}
myArray [0] [0] [0]+1
将跳过10个整数值,即40个字节,而myArray [0] [0]+1
将跳过100个整数值,即400个字节。同样地,myArray [0]+1
将跳过1000个整数值或4000个字节。#include<stdio.h>
int main()
{
int myArray[10][10][10][10]; //A 4 Dimentional array;
int * ptr1 = myArray[10][10][10];
int ** ptr2 = myArray[10][10];
int *** ptr3 = myArray[10];
int **** ptr4 = myArray;
//THESE WILL ALL PRINT THE SAME VALUE
printf("%u, %u, %u, %u\n", ptr1, ptr2, ptr3, ptr4);
//THESE ALSO PRINT SAME VALUES!!
printf("%d, %d, %d, %d\n",ptr1+1,ptr2+1,ptr3+1,ptr4+1);
}
auto
不太适用于指针,通常对于这种类型不够可靠。 - user2485710auto
与指针一起使用非常好,不知道你从哪里得到这个想法。 - Baum mit Augenauto
和指针之间存在任何问题。你能详细说明一下吗? - Domi@
符号来进行提及 :P - 对于误解我感到抱歉。 - Domi