【问题标题】:when does a array act as a pointer in c?数组什么时候在c中充当指针?
【发布时间】:2023-03-29 06:35:01
【问题描述】:

我知道数组名可以用作指针(虽然它是转换后的形式),但我的问题是,是否还有其他一些实例可以将数组用作指针。

【问题讨论】:

  • 这个问题是关于 C 还是关于 C++?请删除这些标记中的任何一个,因为数组在这些非常不同的语言中表现不同。
  • 每当你朝它的大致方向打喷嚏时,它似乎都会衰减。
  • 我不太明白你想在这里问什么。编辑您的问题,使其更清楚。
  • 此处为 C++ 回答:How do I use arrays in C++?

标签: c++ c arrays pointers


【解决方案1】:

从技术上讲,数组名永远不会充当指针。一个 具有数组类型(可能是数组名称)的表达式将转换 任何时候指向指针,数组类型是不合法的,但指针类型是合法的。 并且将数组声明为函数参数 成一个指针的声明。 (这意味着该名称不是 数组名,而是一个指针名。尽管有外表。)

【讨论】:

  • @potrzebie 在表达式a++ 中,a 转换为指针。转换的结果是一个右值,++ 运算符需要一个左值。
【解决方案2】:

这是由于 array-to-pointer 标准转换造成的。具体来说,数组衰减为指向数组第一个元素的指针。

我认为,数组衰减为指针,因为数组和指针的使用方式完全相同:使用可以递增和递减的 index 来在两个方向上遍历元素, 前进后退..

【讨论】:

    【解决方案3】:

    这里是C language standard 的相关部分(你要求C,这就是你得到的):

    6.3.2.1 左值、数组和函数指示符
    ...
    3 除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是 用于初始化数组的字符串字面量,类型为“array of type”的表达式是 转换为类型为“pointer to type”的表达式,它指向 数组对象并且不是左值。如果数组对象有寄存器存储类,则 行为未定义。
    ...
    6.5.2.1 数组下标

    约束

    1 一个表达式应具有类型“指向对象type”的类型,另一个表达式应 具有整数类型,结果具有类型“type”。

    语义

    2 后缀表达式后跟方括号中的表达式[] 是下标 指定数组对象的元素。下标运算符[]的定义 是E1[E2](*((E1)+(E2))) 相同。由于转换规则 适用于二元 + 运算符,如果 E1 是一个数组对象(等效地,指向 数组对象的初始元素)和E2 是一个整数,E1[E2] 指定E2-th E1 的元素(从零开始计数)。
    ...
    6.7.5.3 函数声明符(包括原型)
    ...
    7 将参数声明为“type”的数组应调整为“qualified pointer to type'',其中类型限定符(如果有)是在 [] 的 数组类型推导。如果关键字static 也出现在[] 的 数组类型推导,然后每次调用函数,对应的值 实际参数应提供对数组的第一个元素的访问,其中至少有 由 size 表达式指定的元素

    重要的是,对象(在 C 意义上,是占用内存的东西)和我们用来引用该对象的表达式之间存在差异。数组始终是数组,但用于引用该对象的 表达式 通常是指针类型。

    【讨论】:

      【解决方案4】:
      The identifier itself tells the base address of the memory block.
      
      int arr[SIZE];
      
       arr
      +------+------+----       ----+------+
      |      |      |     . . .     |      |
      +------+------+----       ----+------+
       arr[0] arr[1]  arr[2]  arr[n-1] arr[n]
      
      
      
      The `arr' holds the address of the base address of the block
      
      int *arr = malloc (sizeof (int) * SIZE);
      
       arr
      +------+
      |addr1 |------------+
      +------+            |
      addr_of_arr         |
                          |
                          |
                          V
                        +------+------+----       ----+------+
                        |      |      |     . . .     |      |
                        +------+------+----       ----+------+
                        addr1[0] addr[1]    addr1[n-1] addr1[n]
      

      【讨论】:

        【解决方案5】:

        C 中的数组基本上只是保留连续内存块的指针。所以本质上数组总是像指针一样。

        【讨论】:

        • C 中的数组是数组。你在想 B。
        • 不;试试int foo[3]; int * bar; printf("%d %d\n", (int)sizeof(foo), (int)sizeof(bar));
        猜你喜欢
        • 2010-10-14
        • 2011-01-03
        • 2013-12-26
        • 2012-08-19
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多