方括号阵列

Square bracket arrays

本文关键字:阵列 方括号      更新时间:2023-10-16

可能重复:
数组名称是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-value">是上面a = b的错误(。是这样吗?

为什么?似乎a是数组,而不是指向数组的指针("左操作数必须是l-value"是上面a=b的错误(。

a实际上是一个数组类型,而不是指针类型。不能分配给数组,因为它是一个不可修改的左值。

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

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

char a[] = "ok";

将在堆栈上实际分配3个字节,并用字符串ok填充。但是,如果你做

char a* = "ok";

它将为指针分配足够的空间,并将指针设置到包含字符串ok的数据段中的一个位置(即,它被编译为常量(。

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

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

查看此处的"指针和阵列"部分