【问题标题】:Pass an array to function using pointer in C?使用C中的指针将数组传递给函数?
【发布时间】:2013-04-29 17:59:25
【问题描述】:

首先我声明一个包含 10 个元素的数组 a。然后我调用函数bubbleSort bubbleSort( a, 10); 其中 bubbleSort 是一个声明为的函数 void bubbleSort(int* const array, const int size)

我的问题是“数组”是否是一个指针——这意味着它存储了数组a (array= &a [0]) 的地址,那么我们如何理解这些术语array[1]array[2]array[3].. . 在函数bubbleSort?

这是冒泡排序程序,这部分让我很困惑。

【问题讨论】:

标签: c pointers pass-by-reference


【解决方案1】:

array[1] 表示,根据 C 标准中的定义,*(array+1)。因此,如果array 是一个指针,则该表达式将一个元素添加到指针,然后使用结果访问指向的对象。

a 是一个数组时,您可能习惯于将a[0]a[1]a[2] 等视为数组的元素。但它们实际上经历了与上面的指针相同的过程,只是多了一个步骤。当编译器看到a[1] 并且a 是一个数组时,编译器首先将该数组转换为指向其第一个元素的指针。这是 C 标准中的规则。所以a[1] 实际上是(&a[0])[1]。那么上面的定义就适用了:(&a[0])[1]就是*(&a[0] + 1),所以意思是“取a[0]的地址,加一个元素,访问结果指向的对象。”

因此,调用代码中的a[1] 和被调用代码中的array[1] 具有相同的结果,即使一个以数组开头而另一个使用指针。两者都使用数组的第一个元素的地址,添加一个元素,然后访问结果地址处的对象。

【讨论】:

    【解决方案2】:

    C 定义了整数和指针的加减运算,统称为指针算法。语言规范说,将N 添加到指针上相当于将指针推进N 内存单元,该内存单元等于指针指向的对象的大小。例如,将 10 添加到 int 指针与将其推进 10 个大小的 int 相同;将 10 加到 double 指针上相当于将指针前进 10 倍大小的 double,以此类推。

    接下来,该语言根据指针算术定义数组下标操作:当您编写 array[index] 时,该语言将其视为 *((&array[0])+index) 的等价物。

    此时,语言已经具备了将数组作为指针传递的一切必要条件:将&array[0] 传递给函数,并让函数在指针上使用数组下标运算符。效果和数组本身一样,只是数组的大小不再可用。 API 的结构通过将数组的大小作为单独的参数传递来间接承认这一点。

    【讨论】:

    • 请注意,指针和整数不一定与它们的数学完全兼容——通常,指针是无符号的,它的大小与整数的大小无关。
    【解决方案3】:

    您有一个 int 数组,由其第一个元素的地址标识。 array[1] 等价于 *(array + 1) 表示“数组所指向的值 + 一个元素的大小,称为 int,因为您将其原型化为 int *

    【讨论】:

    • 错了。 array[1] 就是 *(array+1)。您无需考虑数组类型的大小。
    • @Ryan,好吧,编译器会为你解释,但你是对的,代码是错误的。我编辑它。
    【解决方案4】:

    当你声明 a 为大小为 10 的数组时,c 程序将 a[0] 的地址存储在 a 中,由于内存是连续分配的,因此你可以使用 a[2] 访问后续整数,a [4] 等现在,当您将 a 复制到数组时,它实际上是被复制的地址,因此您可以使用数组 [0]、数组 [1] 等访问整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2016-04-27
      相关资源
      最近更新 更多