C程序中指针问题的处理
正如我们所知,数组只通过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; }
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
),这将导致。