3

First I declare an array a with 10 elements. Then I call the function bubbleSort bubbleSort( a, 10); where bubbleSort is a function declared as void bubbleSort(int* const array, const int size)

My question is if "array" is a pointer- which means it stored the address of array a (array= &a [0]) then how can we understand these terms array[1], array[2], array[3]... in the function bubbleSort?

It is the bubble sort program and this part is very confusing for me.

4

4 回答 4

5

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

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

于 2013-05-06T01:55:17.783 回答
4

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

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

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

于 2013-05-06T01:55:26.570 回答
1

您有一个 int 数组,由其第一个元素的地址标识。 array[1]相当于*(array + 1)“数组所指向的值+一个元素的大小,这就是所谓的,int因为你将它原型化为int *

于 2013-05-06T01:55:50.020 回答
0

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

于 2013-05-06T04:42:05.077 回答