方括号阵列

时间:2011-04-06 17:19:33

标签: c++ arrays square-bracket

  

可能重复:
  Is array name a pointer in C?

因此,我通常使用指针声明数组。

但是,您也可以使用方括号表示法声明数组:

char a[] = "ok" ;
char b[] = "to" ;
char *pa = a ;

cout << "a " << sizeof( a ) << endl ;   // 3
cout << "pa " << sizeof( pa ) << endl ; // 4

特殊的是,sizeof( a )将是数组的实际大小(以字节为单位),而不是指针的大小

我发现这很奇怪,因为指针在哪里呢?方括号声明的数组实际上是一种具有(sizeof(char)*numElements)字节的数据结构吗?

此外,您无法将a重新分配给b:

a = b ; // ILLEGAL.

为什么?似乎是数组而不是指向数组的指针(“左操作数必须是l值”是上面a = b的错误) 。是吗?

4 个答案:

答案 0 :(得分:5)

  

为什么?似乎a是数组而不是指向数组的指针(“左操作数必须是l值”是上面a = b的错误)。

a确实是数组类型而不是指针类型。 您无法分配给数组,因为它是不可修改的左值。

BTW数组在传递给函数时衰减指向第一个元素。

答案 1 :(得分:1)

在声明中使用方括号时,实际上是在堆栈上分配空间。当您使用*声明指针时,您只是声明一个指针。所以

char a[] = "ok";

实际上会在堆栈上分配3个字节,并用字符串ok\0填充它。但是,如果你这样做

char a* = "ok";

它将为指针分配足够的空间,并将指针设置为包含字符串ok\0的数据部分中的位置(即它以常量形式编译)。

答案 2 :(得分:0)

正确,a的类型是长度为3的char数组。数组变量可以分配给指针变量,因为数组类型可以衰减为指向数组中第一个元素的指针。

答案 3 :(得分:0)

简而言之,它是指向数组中第一个(第零个)元素的常量指针。

查看“指针和阵列”部分here