假设我有一个函数 ,int function(int N, int c[N]){...}
以整数和数组作为参数。假设现在我有一个**c
大小为“N 乘以 2”的双精度数组,并假设我想将该函数function
应用于双箭头的一列,c[i][0]
从i
N-1 变化。我应该如何使用这个功能。它看起来像function(N,*c[0])
吗?
有人可以帮忙吗?
假设我有一个函数 ,int function(int N, int c[N]){...}
以整数和数组作为参数。假设现在我有一个**c
大小为“N 乘以 2”的双精度数组,并假设我想将该函数function
应用于双箭头的一列,c[i][0]
从i
N-1 变化。我应该如何使用这个功能。它看起来像function(N,*c[0])
吗?
有人可以帮忙吗?
在 c 语言中,对于单维数组,在将数组传递给该函数时,您无需在函数参数中提及数组的大小。
如果是一维数组
...
int a[10];
func(10, a);
...
void func(int size, int x[]) //no need to mention like int x[10]
{
//here x is not an array. Its equivalent to int *
printf("%d", sizeof(x)); // this will print 4 or 8 not 40
}
如果是二维数组
...
int a[10][5];
func (10, a);
...
void (int rows, int x[][5]) //here int x[][] is invalid
{
}
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 会考虑存储在数组中的元素类型的大小,并相应地递增指针)。
因此,当传递二维数组时,数组衰减为指向其第一个元素的指针 - 这是一个数组。
采用二维数组的函数签名可以写成
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);
适用于动态分配的二维数组。