首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C中,将数组作为*arr和*arr[]传递给函数有什么区别?

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

Stack Overflow用户
提问于 2019-05-21 02:47:40
回答 2查看 509关注 0票数 0
代码语言:javascript
运行
复制
#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[]时,它将给出

代码语言:javascript
运行
复制
1 3 5 7 9 0 0 965108401 262144 404875544 

看起来i += 2发生在for循环中。

修改后的代码如下

代码语言:javascript
运行
复制
#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[]到底是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-21 07:54:15

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

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

要记住的是:对C初学者来说,正确的间接水平可能并不容易,但正确编写C代码是至关重要的。使用适当的/最近的编译器,并注意警告。

票数 0
EN

Stack Overflow用户

发布于 2019-05-21 08:16:18

星号是指向类型的指针。

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

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

除去int *int[]的差异,*arr[]是指向数组的指针。因为您可以使用指针机制/算术来使用指针访问数组,所以可以将*arr[]看作一个二维数组。也就是说,与只有指针的*arr[]等价的是int**

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56230439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档