首先,我声明一个包含10个元素的数组a
。然后我调用函数bubbleSort
bubbleSort( a, 10);
其中bubbleSort是一个声明为的函数
void bubbleSort(int* const array, const int size)
我的问题是" array"是一个指针 - 这意味着它存储了数组a
(array= &a [0]
)的地址,那么我们如何理解这些术语array[1]
,array[2]
,array[3]
.. 。在函数bubbleSort
?
这是泡泡分类程序,这部分对我来说非常混乱。
答案 0 :(得分:5)
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]等来访问整数。