1

正如我们所知,数组仅在 C 中通过指针传递,那么swap1(arr[i],arr[j])下面意味着两个指针将传递给函数,swap1()那么为什么swap1(arr[i],arr[j])会给我错误?根据swap1()应该传递两个指针的函数原型,我正在传递它。

另一方面,当我实际传递地址swap1(&arr[i],&arr[j])时,它工作正常,这是显而易见的。

void swap1(int *a,int *b){
   int temp = *a;
   *a = *b;
   *b = temp;
}
void bubble(int arr[], int i, int n)
{
    for(int j=i+1;j<n;j++){
        if(arr[i]>arr[j])
        swap1(arr[i],arr[j]);
    }
}
4

3 回答 3

2

bubble函数中,变量arr是一个指针(类型int *)。这意味着arr[i](对于 any i不是指针,而是int

当您将这些int值传递给swap编译器时应该抱怨它,这是正确的,因为该swap函数需要指针(再次是 type int *)。

要获得指向您的指针,arr[i]您需要使用地址运算符&,如&arr[i]

swap1(&arr[i], &arr[j]);
于 2020-02-26T12:22:05.487 回答
0

whenarr是一个数组,实际上传递 arr 实际上是传递一个指向第一个元素的指针。但是,当您使用 deference operator 时[i],您传递的是i-th元素的值而不是其地址。

于 2020-02-26T12:21:54.913 回答
0

来自 C 标准(6.5.2.1 数组下标)

2 后缀表达式后跟方括号 [] 中的表达式是数组对象元素的下标名称。下标运算符[]的定义是E1[E2]等同于(*((E1)+(E2)))。由于适用于二元 + 运算符的转换规则,如果 E1 是数组对象(等效地,指向数组对象的初始元素的指针)并且 E2 是整数,则 E1[E2] 指定第 E2 个元素E1(从零开始计数)。

所以当你调用函数时

swap1(arr[i],arr[j]);

您正在传递数组的两个元素的值。要传递指向这些元素的指针,您可以编写

swap1( arr + i, arr + j );

如果第一次调用重写,因为它是在 C 标准的引用中写的,那么差异将很明显

swap1(arr[i],arr[j]);

相当于

swap1( *( arr + i ), *( arr +j ) );

也就是说,在将控件传递给函数之前,指针被取消引用。

于 2020-02-26T12:36:55.580 回答