0

我对 C 中数组的理解是否正确?数组只不过是一种语法便利,例如,当您在 C 代码中声明一个数组时:

type my_array[x];

编译器将其视为等同于:

type *my_array = malloc(sizeof(*my_array) * x);

使用free系统调用,my_array一旦我们离开my_array.

一旦my_array被宣布

my_array[y];

仅此而已:

*(my_array + y)

将其转换为字符串;我也想知道幕后发生了什么

char *my_string = "Hello"

my_string = "Hello"
4

3 回答 3

2

不,数组对象是数组对象。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' };
于 2013-09-18T23:50:52.173 回答
1

不!

type array[n]是存储在堆栈中的变量

type *array也是存储在堆栈中的指针变量。但之后array = malloc(sizeof(*array) * n);它会指向堆上的一些数据

于 2013-09-19T00:33:48.833 回答
0

如果它像鸭子一样走路,像鸭子一样游泳,像鸭子一样飞翔,那么它就是鸭子。

那么,让我们看看。正如您正确描述的那样,数组和指针具有一些共同的属性,但是,您可以看到存在一些差异。在这里阅读更多。

于 2013-09-18T23:20:28.210 回答