【问题标题】:Array syntax and pointers in CC中的数组语法和指针
【发布时间】:2013-09-18 22:24:13
【问题描述】:

我对 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"

【问题讨论】:

  • 不完全是。当您执行type my_array[x] 时,编译器确实将其视为一个数组,甚至知道在编译时sizeof(my_array)x * sizeof(type),但如果您声明type *my_array = malloc(x * sizeof(type)),情况并非如此。在这种情况下,sizeof(my_array) 是指向编译器类型的指针的大小。
  • 不要假设 C 编译器会为您创建 mallocfree 调用。这将完全违背该语言的目标,该目标应该让您绝对控制您使用的内存,特别是在 malloc 可能非常昂贵的受限环境中。还有其他内存存储机制。
  • 另一个区别:数组在其生命周期内指向同一个地址,而指针可以更改。

标签: c arrays string pointers malloc


【解决方案1】:

不,数组对象是数组对象。 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" 是一个字符串文字。它是char[6] 类型的表达式,指的是匿名静态分配的数组对象。如果它出现在赋值或初始化器的 RHS 上,它会像任何数组表达式一样转换为指针。第一行初始化my_string,因此它指向"Hello" 的第一个字符。第二个是做同样事情的指针赋值。

那么这个呢?

char str[] = "Hello";

这是不发生数组到指针转换的第三个上下文。 str 的大小取自字符串文字的大小,并将数组复制到 str。同理:

char str[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

【讨论】:

    【解决方案2】:

    没有!

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多