在C语言中,将数组作为* arr和* arr []传递给函数有什么区别?

时间:2019-05-21 02:47:41

标签: c arrays pointers

#include <stdio.h>

void test(int *arr, int n)
{
    for(int i = 0; i < n; ++i)
        printf("%d ", *(arr + i));
    printf("\n");
}

int main(void) {

    int a[10] = { 1,2,3,4,5,6,7,8,9,10};

    test(a,10);

    return 0;
}

这给出了正确的答案,即“ 1 2 3 4 5 6 7 8 9 10” 但是当我将test函数中的第一个参数的类型更改为*arr[]时,它给出

1 3 5 7 9 0 0 965108401 262144 404875544 

好像i += 2发生在for循环中。

更改的代码在下面

#include <stdio.h>

void test(int *arr[], int n)
{
    for(int i = 0; i < n; ++i)
        printf("%d ", *(arr + i));
    printf("\n");
}

int main(void) {

    int a[10] = { 1,2,3,4,5,6,7,8,9,10};

    test(a,10);

    return 0;
}

*arr[]实际上是什么?

2 个答案:

答案 0 :(得分:0)

在主函数中,a被声明为大小为10的int数组。将其传递给函数时,它很好地衰减指向其第一个元素的指针,因此声明如果可以的话,则为int *arr

另一方面,int *arr[]声明了一个(不完整的)指向int的指针数组。它会以int **的形式在函数中进行处理,而不是进行处理,从而调用未定义的行为。在您的实现中,指针的大小似乎是int的两倍,这解释了为什么它看起来像该函数占用了第二个项目。但是由于有了UB,您甚至不能依靠它

要记住的是:对于C初学者来说,正确的间接级别可能并不容易,但是正确编写C代码至关重要。使用良好的/最新的编译器,并注意警告。

答案 1 :(得分:0)

星号是指向类型的指针。

因此,int[] *是一个指向整数数组的指针。也就是说,您有一个指向数组类型/变量的指针。

另一方面,int *是一个指向int的指针。在int[]int *之间重定向时,有一种常见的行为,但这并不相同(例如,第一个Google搜索结果https://www.quora.com/What-is-the-difference-between-pointer-and-array中的一个)

撇开int *int[]的区别,*arr[]是指向数组的指针。因为您可以使用指针机制/算术来使用指针访问数组,所以可以将*arr[]视为二维数组。也就是说,仅带有指针的*arr[]等效于int**