C++ C+中静态数组的类型和地址是什么+;?
使用Visual Studio Express 2013。我原以为我了解静态数组和动态数组,但以下几点让我感到困惑:C++ C+中静态数组的类型和地址是什么+;?,c++,C++,使用Visual Studio Express 2013。我原以为我了解静态数组和动态数组,但以下几点让我感到困惑: int* a = new int[3]; \\ dynamic array int** pa = &a; int b[3]; \\ static array int** pb = &b; \\ error: cannot convert from 'int (*)[3]' to 'int **' 好的,所以我尝试int(*)[3]pb=&b但它甚至在语法上都不
int* a = new int[3]; \\ dynamic array
int** pa = &a;
int b[3]; \\ static array
int** pb = &b; \\ error: cannot convert from 'int (*)[3]' to 'int **'
好的,所以我尝试int(*)[3]pb=&b代码>但它甚至在语法上都不正确。“局部变量”窗口显示pb是一个int[3]
,但int[3]*pb=&b代码>也不正确
对我来说,b
与pa
具有相同的值也似乎很奇怪。如果我替换声明intb[3]代码>带有声明+初始化intb[3]={}代码>然后奇怪的东西消失了,所以可能只是一个VS错误:
但我仍然无法找到静态数组的地址。如果我在即时窗口中键入&b
,那么我得到的输出与我刚才键入的b
完全相同,与“&a”和“a”相比,这两个词显然是不同的:
< P>动态数组是C++中非常奇怪的部分。它的类型永远不是语言中任何表达式的类型,而且您永远无法看到动态数组作为一个整体。当你说newt[N]
时,你得到的只是一个指向T[N]
类型的虚拟数组的第一个元素的指针。(还要注意,这是一种真正的“动态类型”!)
相比之下,您的b
是一个实际的数组对象,因此它的地址类型自然是“指向数组的指针”。如果希望指针指向其第一个元素,则必须首先创建这样一个指针:
int b[3];
int * b0 = &b[0]; // or just "int * b0 = b;" :-S
int ** pb = &b0;
<变量>代码> B0<代码>这里是动态变量中的变量<代码> A<代码> -包含第一个数组元素的地址的指针变量。 @ Kerrek说动态数组是C++的奇怪部分;我说静态数组很奇怪,它们的语义不同于语言中的其他任何东西
给定一个数组:
int foo[3] = { 1, 2, 3 };
int (*pfoo)[3] = &foo;
指向数组的指针:
int foo[3] = { 1, 2, 3 };
int (*pfoo)[3] = &foo;
对数组的引用(模板功能异常强大):
指向第一个元素的指针:
int *pa = &foo[0];
assert(*pa == 1);
int *pb = foo; // auto decay!
assert(pa == pb);
assert(pa == foo); // auto decay strikes again
assert(pa+0 == foo+0); // and again
请注意,“衰减到指针”和“指针到实际数组”具有相同的值,因为它们指向相同的内存位置:
assert((void*)foo == (void*)&foo);
但对于任何大于1的数组大小,此断言将失败:
assert((void*)(foo+1) == (void*)(&foo+1));
因为:
static_assert(sizeof(*(foo+0)) == sizeof(int), "");
static_assert(sizeof(*(&foo)) == sizeof(int[3]), "");
无法进行复制分配:
int bar[3] = foo; // compile error!
。。。除非它发生在编译器生成的代码中:
struct workaround { int foo[3]; };
workaround a = { { 1, 2, 3 } };
workaround b = a;
assert(b.foo[0] == 1); // the array got copied!
不能是函数的结果:
int (func1())[3]; // syntatically correct, but prohibited by C++
因此,我们必须采取变通办法:
std::array<int, 3> func2();
void func3( int (&out_arr)[3] );
std::array func2();
无效函数3(int&out_arr)[3];
如果这不奇怪,那么我不知道是什么
(尽管如此,堆栈分配FTW)。那么&a
的类似物是什么?这就是我在寻找的…@GeorgeSkelton:如果b0
是a
的类似物,那么&a
的类似物是&b0
…值得指出的是pb
的声明应该看起来像int(*pb)[3]=&b代码>。你只是把标识符放错地方了。谢谢,我从中学到了一些好东西