Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数参数中的int*vs int[]vs int(*)[]。我应该用哪一个?_C_Arrays_Function_Pointers_Parameters - Fatal编程技术网

C 函数参数中的int*vs int[]vs int(*)[]。我应该用哪一个?

C 函数参数中的int*vs int[]vs int(*)[]。我应该用哪一个?,c,arrays,function,pointers,parameters,C,Arrays,Function,Pointers,Parameters,在C语言中,有许多不同的方法来声明函数的参数,该函数将数组作为通过指针传递的参数 我准备了一个例子,向你说明我的意思。它是C++中的代码> STD::Sudio函数的一种实现。它是一个函数,用于执行数组中所有元素的加法并返回结果 我可以这样写: int accumulate(int n, int *array) { int i; int sum = 0; for (i = 0; i < n; ++i) { sum += array[i]; }

在C语言中,有许多不同的方法来声明函数的参数,该函数将数组作为通过指针传递的参数

我准备了一个例子,向你说明我的意思。它是C++中的代码> STD::Sudio函数的一种实现。它是一个函数,用于执行数组中所有元素的加法并返回结果

我可以这样写:

int accumulate(int n, int *array)
{
    int i;
    int sum = 0;
    for (i = 0; i < n; ++i) {
        sum += array[i];
    }
    return sum;
}
int accumulate(int n, int (*array)[])
{
    int i;
    int sum = 0;
    for (i = 0; i < n; ++i) {
        sum += (*array)[i];
    }
    return sum;
}
这是调用第三个版本的方式:

int main(void)
{
    int a[] = {3, 4, 2, 4, 6, 1, -40, 23, 35};
    printf("%d\n", accumulate(ARRAY_LENGTH(a), a));
    return 0;
}
int main(void)
{
    int a[] = {3, 4, 2, 4, 6, 1, -40, 23, 35};
    printf("%d\n", accumulate(ARRAY_LENGTH(a), &a));
    return 0;
}
请注意,第三个选项要求用户使用
&a
明确指定
a
的地址。前两个选项不需要这样做,因为数组隐式地转换为指向C中相同类型的指针

我一直倾向于第三种方法

这就是为什么:

  • 它与指针传递其他类型的方式更为一致

    int draw_point(struct point *p);
    
    int main()
    {
        struct point p = {3, 4};
        draw_point(&p); // Here is the 'address of' operator required.
    }
    
  • 它可以使用诸如
    ARRAY\u LENGTH
    之类的宏来获取数组中的元素数量

    #include <stdio.h>
    #define ARRAY_LENGTH(A) (sizeof(A) / sizeof(A[0]))
    
    void this_works(int (*array)[10])
    {
        /* This works! */
        printf("%d\n", ARRAY_LENGTH(*array));
    }
    
    void this_is_invalid_and_dangerous(int array[10])
    {
        /* This does NOT work because `array` is actually a pointer. */
        printf("%d\n", ARRAY_LENGTH(array));
    }
    
    #包括
    #定义数组长度(A)(sizeof(A)/sizeof(A[0]))
    无效此_工作(int(*array)[10])
    {
    /*这管用*/
    printf(“%d\n”,数组长度(*ARRAY));
    }
    无效此\u无效且危险(int数组[10])
    {
    /*这不起作用,因为“array”实际上是一个指针*/
    printf(“%d\n”,数组长度(数组));
    }
    
我认为
int-array[]
(和
int*array
)与
int(*array)[
相比的唯一优势是,当您想要获取索引时,可以编写
array[X]
,而不是
(*array)[X]

但因为我不是专业人士,我会问你喜欢哪个版本

你什么时候用什么?选择其中一个选项而不是另一个选项的原因是什么?


我主要使用的是
int(*array)[N]
,但我发现其他两种方法也很常见。

我也更喜欢第三种变体,但它不是很常用。如果是这样,我会用C99写下:

int accumulate(size_t n, int (*array)[n]) { ....

这样,
sizeof*array
在函数内部的所有情况下都能工作。

我也喜欢第三种变体,但它不是很常用。如果是这样,我会用C99写下:

int accumulate(size_t n, int (*array)[n]) { ....

这样
sizeof*array
在函数内部的所有情况下都能工作。

当用作函数参数时,
int-array[]
int*array
是相同的。你可以用任何一种。这是品味的问题
int(*array)[]
非常单调乏味,没有得到广泛应用


int(*array)[n]
在将2D数组传递给函数时使用最广泛。在这种情况下,当用作函数参数时,您可以作为
array[i][j]

访问数组元素,
int-array[]
int*array
是相同的。你可以用任何一种。这是品味的问题
int(*array)[]
非常单调乏味,没有得到广泛应用


int(*array)[n]
在将2D数组传递给函数时使用最广泛。在这种情况下,您可以通过
array[i][j]

访问数组的元素。您是说二维数组吗?sizeof知道行长吗?@haccks,不,
[*]
仅用于函数的原型,如果参数的名称不可用。要真正了解
sizeof*array
编译器必须查看实际表达式,并且它是要计算的函数定义之一。@PaulOgilvie,不,我这里不是说2D数组。这是一种将指针传递到一维数组并知道函数中数组大小的方法。@JensGustedt;你是对的。它只用于原型。你是说二维阵列吗?sizeof知道行长吗?@haccks,不,
[*]
仅用于函数的原型,如果参数的名称不可用。要真正了解
sizeof*array
编译器必须查看实际表达式,并且它是要计算的函数定义之一。@PaulOgilvie,不,我这里不是说2D数组。这是一种将指针传递到一维数组并知道函数中数组大小的方法。@JensGustedt;你是对的。这只是原型。为什么这被否决了?我对两个答案都不满意。它们都没有提到
指向数组的指针
——这是
int-array[]
(在函数参数列表的上下文中实际上是
int*
)和
int(*array)[
@Jonathan之间的定义区别,如果您(或其他人)有什么补充,你可以作出一个新的答案,我会接受,如果它是更好的。也许这次我很早就接受了一个答案,这会阻碍新答案的出现。当我回头看这个问题时,我也意识到这个问答网站可能太“基于意见”,但如果你认为其他答案遗漏了什么,那就去做一个新的答案。为什么投票被否决了?我对这两个答案都不满意。它们都没有提到
指向数组的指针
——这是
int-array[]
(在函数参数列表的上下文中实际上是
int*
)和
int(*array)[
@Jonathan之间的定义区别,如果您(或其他人)有什么补充,你可以作出一个新的答案,我会接受,如果它是更好的。也许这次我很早就接受了一个答案,这会阻碍新答案的出现。当我回头看这个问题时,我也意识到这个问答网站可能太“基于意见”,但如果你认为其他答案遗漏了什么,那就去做一个新的答案,而不是真正的答案。你回答的第一部分已经在问题中陈述了。然后,这个问题不是关于二维阵列。。。不,
intacculate(intn,int(*array)[])
不足以使用
array[i]