C++ C+中静态数组的类型和地址是什么+;?

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但它甚至在语法上都不

使用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但它甚至在语法上都不正确。“局部变量”窗口显示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。你只是把标识符放错地方了。谢谢,我从中学到了一些好东西