![](/img/trans.png)
[英]What is the difference between *&arr and *&arr[0] in C++, if arr is an array?
[英]C++: What is the difference between ' arr ' and ' arr[] '
我正在研究的程序的一部分是对一组int进行排序,所以我使用最简单的算法, 选择排序 ,这样做。 当我在线检查算法时,我发现函数的参数是selectionSort(int arr[], int n)
,其中n是数组的大小,稍后将输入; 所以当我在main()
函数中调用该函数时,我将其调用如下selectionSort(arr[n], n)
并尝试打印数组只是为了检查函数是否正常工作并且它不起作用 - 只打印数组而不排序。 然后我就删除了方括号,效果很好。
这是代码:
void swap(int *xp, int *yp){
int temp = *xp;
*xp = *yp;
*yp = temp;
}
void selectionSort(int arr[], int n){
int i, j, min_idx;
for (i = 0; i < n-1; i++)
{
min_idx = i;
for (j = i+1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
swap(&arr[min_idx], &arr[i]);
}
}
int main(){
int n; cin>>n;
int arr[n];
for(int i = 0; i < n; i++){
cin>>arr[i]; //fill in the array
}
selectionSort(arr, n); //Here is the point, if I write arr[]
for(int i = 0; i < n; i++){cout<<arr[i];}
}
当你在函数调用中使用arr
时,它将衰减为指向其第一个元素的指针,它等于&arr[0]
。 它将具有int*
类型。
如果使用arr[i]
(对于任何有效的索引i
),则传递数组中单个元素的值。 它将具有int
类型。
由于函数需要一个指针(当声明一个参数时, int arr[]
等于int* arr
),传递plain arr
会正常工作,但arr[i]
会收到编译器的抱怨,因为你传递了一些错误类型。 但是,根据数组的类型,此抱怨可能只是一个警告 ,编译器将假装该值是一个指针。 这是错误的,将导致未定义的行为 (并可能崩溃)。 对此的教训是:不要忽略来自编译器的警告消息,而是将它们视为实际错误。
如果你在调用函数时编写arr[]
(没有任何索引),那就是语法错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.