不,数组对象是数组对象。C 有一些奇怪的规则,使数组和指针看起来是同一件事,或者至少非常相似,但它们绝对不是。
本声明:
int my_array[100];
创建一个数组对象;对象的大小为100 * sizeof (int)
。它不创建指针对象。
没有malloc()
,甚至是隐含的。存储空间的my_array
分配方式与在同一范围内声明的任何对象的存储空间相同。
可能让您感到困惑的是,在大多数但不是所有上下文中,数组类型的表达式被隐式转换为指向数组第一个元素的指针。(这为您提供了一个指针值;仍然没有指针对象。)如果数组表达式是一元&
或sizeof
. &my_array
给你数组的地址,而不是一些不存在的指针对象。sizeof my_array
是整个数组的大小(100 * sizeof (int)`),而不是指针的大小。
此外,如果您使用数组类型定义函数参数:
void func(int param[]) { ... }
它在编译时调整为指针:
void func(int *param) { ... }
这不是转换;在那种情况下(并且仅在那种情况下),int param[]
真正的意思是 int *param
.
此外,数组索引:
my_array[3] = 42;
是根据指针算术定义的——这意味着必须先将前缀my_array
转换为指针,然后才能对其进行索引。
要记住的最重要的事情是:数组不是指针。指针不是数组。
comp.lang.c FAQ的第 6 节很好地解释了这一切。
一旦 my_array 被声明
my_array[y];
仅此而已:
*(my_array + y)
是的,因为my_array
被转换为指针,并且[]
定义了运算符,因此x[y]
意味着*(x+y)
.
将其转换为字符串;我也想知道幕后发生了什么
char *my_string = "Hello"
和
my_string = "Hello"
"Hello"
是一个字符串文字。它是 type 的表达式char[6]
,指的是匿名静态分配的数组对象。如果它出现在赋值或初始化器的 RHS 上,它会像任何数组表达式一样转换为指针。第一行初始化my_string
,因此它指向 的第一个字符"Hello"
。第二个是做同样事情的指针赋值。
那么这个呢?
char str[] = "Hello";
这是不发生数组到指针转换的第三种情况。str
从字符串文字的大小获取其大小,并将数组复制到str
. 它与以下内容相同:
char str[] = { 'H', 'e', 'l', 'l', 'o', '\0' };