使用C中的指针传递数组来运行?

时间:2013-05-06 01:47:33

标签: c pointers pass-by-reference

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

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

这是泡泡分类程序,这部分对我来说非常混乱。

4 个答案:

答案 0 :(得分:5)

根据C标准的定义,

array[1]表示*(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),所以它的意思是“取一个[0]的地址,添加一个元素,然后访问结果指向的对象。”

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

答案 1 :(得分:4)

C定义整数和指针的加法和减法操作,统称为指针算术。语言规范说,向指针添加N等效于将指针推进N个单位的内存,等于指针指向的对象的大小。例如,将10添加到int指针与将其推进10个int大小相同;将10添加到double指针相当于将指针推进10个double大小,依此类推。

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

此时,语言具有将数组作为指针传递所需的一切:取&array[0],将其传递给函数,并让函数在指针上使用数组下标运算符。除了数组的大小不再可用之外,效果与传递数组本身的效果相同。 API的结构间接地通过将数组的大小作为单独的参数传递来确认。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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