繁体   English   中英

C ++:'arr'和'arr []之间的区别是什么?

[英]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];}
}

选择排序参考

我正在研究Code Forces的问题

当你在函数调用中使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM