在C语言中如何使用指针传递数组给函数?

3

首先,我声明了一个有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]……?

这是一个冒泡排序程序,这部分对我来说很困惑。


4
数组会衰变(decay)成指针。 - Elazar
@Elazar 这个问题与编程有关。 - Alvin Wong
请参见此处此处,以及无数其他相关问题。 - michaelb958--GoFundMonica
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]*(&a[0] + 1),所以它的意思是“取a[0]的地址,加上一个元素,并访问结果指向的对象”。
因此,在调用代码中a[1]和在被调用代码中array[1]具有相同的结果,即使一个使用数组,另一个使用指针。两者都使用数组的第一个元素的地址,加上一个元素,并访问结果地址上的对象。

4

C语言定义了整数和指针的加减操作,称为指针算术。语言规范说明,在指针上加上N,等同于将指针前进N个内存单元,这些内存单元大小等于指针所指向对象的大小。例如,将十加到一个int指针上,相当于将其前进十个int大小;将十加到double指针上,相当于将其前进十个double大小。

然后,语言以指针算术方式定义了数组下标操作:当你写array[index]时,语言会将其视为等同于*((&array[0])+index)

此时,语言已经具备了通过指针传递数组的所有必要条件:取&array[0],将其传递给函数,让函数在指针上使用数组下标操作符。效果就好像传递的是数组本身,不同之处只是数组大小不再可用。你的API结构间接表明了这一点,即通过单独的参数传递数组的大小。


请注意,指针和整数在数学上并不完全兼容-通常情况下,指针是无符号的,并且其大小与整数的大小无关。 - Richard J. Ross III

1
您有一个由第一个元素的地址标识的整数数组。 array[1] 等同于 *(array + 1),这意味着“指向的值为 `array` 加上一个元素的大小,并且这个元素被声明为 `int*` 类型的变量所代表的大小,也就是 `int` 类型。”

1
这是错误的。array[1] 简单地等同于 *(array+1)。您不需要考虑数组类型的大小。 - Ryan
@Ryan,编译器已经为您处理了,但是您是正确的,代码是错误的。我进行了编辑。 - Antzi

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接