因此,我通常使用指针声明数组。
但是,您也可以使用方括号表示法声明数组:
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
的错误) 。是吗?
答案 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