C程序中指针问题的处理

C程序中指针问题的处理,c,arrays,pointers,subscript-operator,C,Arrays,Pointers,Subscript Operator,正如我们所知,数组只通过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; }

正如我们所知,数组只通过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]);
    }
}
void swap1(int*a,int*b){
int temp=*a;
*a=*b;
*b=温度;
}
无效气泡(int arr[],int i,int n)
{
对于(int j=i+1;jarr[j])
swap1(arr[i],arr[j]);
}
}

arr
是一个数组时,传递arr实际上就是传递指向第一个元素的指针。但是,当您使用差异运算符
[i]
时,您传递的是
i-th
元素的值,而不是它的地址。

气泡
函数中,变量
arr
是一个指针(键入
int*
)。这意味着
arr[i]
(对于任何
i
)不是指针,而是
int

当您将这些
int
值传递给
swap
时,编译器应该对此进行投诉,这是正确的,因为
swap
函数需要指针(类型也是
int*

要获取指向
arr[i]
的指针,您需要使用操作员
&
的地址,如
&arr[i]

swap1(&arr[i], &arr[j]);
来自C标准(6.5.2.1数组订阅)

2后缀表达式后跟方括号中的表达式[] 数组对象元素的下标指定。这个 下标运算符[]的定义是E1[E2]与 (*((E1)+(E2)))。因为适用于 二进制+运算符,如果E1是数组对象(相当于指针 ,E2是一个整数, E1[E2]指定E1的第E2个元素(从零开始计数)

所以当你调用函数

swap1(arr[i],arr[j]);
您正在传递数组的两个元素的值。要传递指向这些元素的指针,可以编写

swap1( arr + i, arr + j );
如果在引用C标准时第一次调用重写,则差异将非常明显

swap1(arr[i],arr[j]);
相当于

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

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

打开所有警告和错误(
-Wall-Wextra-Werror
),这将导致。