c - 如何将一维和二维数组参数传递给 c 中的函数

标签 c arrays argument-passing

假设我有一个函数,int function(int N, int c[N]){...},将一个整数和一个数组作为参数。假设现在我有一个大小为“N 乘以 2”的 double 组 **c 并且假设我想将函数 function 应用于双箭头的一列,c[i][0]i 从到 N-1 变化。我应该如何使用此功能。它看起来像 function(N,*c[0]) 吗?

有人可以帮忙吗?

最佳答案

C 中的数组在传递给函数时总是衰减为指向其第一个元素的指针。在某些情况下知道这一点是件好事。

举个例子,你可以这样写

int list[10];
func (int *x) {
    int i;
    for (i = 0; i < 10; i++) {
         printf("%d", x[i]);
    }
 }

x[i] 实际上只是语法糖。在 C 中,当您使用方括号表示法访问数组元素时,它会转换为 *(x + i),其中 x 是数组的名称。

这是因为指针运算。如果 x 是 10 个整数数组的名称,则表达式中 x 的值是数组第一个整数的地址。

x + i 将始终指向 x 之后的第 i 个元素(C 会考虑存储在数组中的元素类型的大小,并相应地递增指针)。

因此,当传递 2d 数组时,数组衰减为指向其第一个元素的指针 - 这是一个数组。

采用二维数组的函数签名可以写成

func(int x[][columns] {
      ...
} 
// but could also be written as

func(int (*x)[columns]) {
    ...
}

表示 x 是一个指向整数数组的指针。

有时您需要编写一个函数来接受二维数组,其中宽度直到运行时才知道。在这种情况下,您可以传递指向 [0][0] 元素的指针,同时传递二维,然后使用指针运算来获取正确的元素。例如,

print_2d_array (int *x, height, width) {
    int i, j;
       for (i = 0; i < height; i++) {
         for (j = 0; j < width; j++) {
            printf("%d", x[i * width + j]);
         }
     }
}

int list[10][10];
print_2d_array (&list[0][0], 10, 10);

适用于动态分配的二维数组。

关于c - 如何将一维和二维数组参数传递给 c 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123480/

相关文章:

cocoa - 如何在 Xcode 中显示“记录消息”窗口

c++ - 将表达式评估为函数参数时,Visual Studio 2013 有符号/无符号整数数学行为不同,编译器开关?

jQuery:如何在函数内使用函数参数作为函数名称?

C 语言 if else 语句中的字符串复制

C - .h 和 .c 文件中的类型冲突

c - 释放指向 'double' 值的指针

c - 与 c 中的大小相比,为什么 float 的输出包含更多零

arrays - 如何快速将数据附加到 JSON 格式数组中?

C-Array of Pointers 不同的索引方式

c++ - 关于按引用调用的问题?