1

可能重复:
数组名称是 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.

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

4

4 回答 4

5

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

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

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

于 2011-04-06T17:22:01.987 回答
1

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

char a[] = "ok";

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

char a* = "ok";

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

于 2011-04-06T17:24:08.243 回答
0

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

于 2011-04-06T17:23:29.770 回答
0

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

在此处查看“指针和数组”部分

于 2011-04-06T17:26:37.540 回答