[英]Multidimensional arrays understanding for c
我有一个关于将数组传递给另一个函数的问题。
#include <stdio.h>
void print (int ar[]);
main () {
int array[2][2] = {1,2,3,4};
print(array);
}
void print (int ar[]) {
printf("%d\n", ar[0]);
printf("%d\n", *(ar+1));
}
因此,如果我将数组传递给函数print的话。 我是传递第一个一维数组的地址(array [0])还是刚传递了第一个变量的地址(array [0] [0])。
至于打印功能,在这种情况下,我是否正确地说是通过打印ar [0]来打印array [0] [0]?
但是,为什么在打印*(ar + 1)的情况下,我实际上是在打印array [0] [1]而不是array [1] [0]?
提前谢谢大家!
如果要将二维数组传递给函数:
int array[NROWS][NCOLUMNS];
print(array);
该函数的声明必须匹配:
void print(int array[][NCOLUMNS])
{ ... }
要么
void print(int (*ap)[NCOLUMNS]) /* ap is a pointer to an array */
{ ... }
作为数组的数组的2D数组会衰减指向数组的指针,而不是指向指针的指针。
因此,假设[I]是否将
array
传递给函数array[0]
)的地址还是我传递第一个变量(array[0][0]
)的地址?
您正在传递一个指向array
array[0]
的第一个元素的指针,该元素本身就是一个数组。 该指针的值与指向array[0][0]
的指针相同,但类型不同。 实际上,您的代码是不正确的,因为参数的类型和函数参数的类型不一致,但是只要类型int(*)[]
和int *
具有相同的表示形式,则重新解释将在实践中起作用。
至于
ar[0]
打印array[0][0]
?
是的,当您像在示例中那样调用print()
,前提是类型表示形式如上所述。
但是为什么在打印
*(ar+1)
的情况下,我实际上是在打印array[0][1]
而不是array[1][0]
?
因为ar
是指向array
的第一个元素的指针,即一维数组array[0]
。 它的元素是array[0][0]
, array[0][1]
等。因此ar + 1
是指向array[0]
的第二个元素的指针,后者是array[0][1]
。
您有两个选择可以使代码正确,这两个选项都可能有助于弄清所涉及的问题。 您可以更改传递给print()
的参数以与该函数一致:
print(array[0]);
或者,您可以更改print()
参数的声明类型,并对其使用进行相应的更改:
void print(int (*ar)[2]) {
printf("%d\n", ar[0][0]);
printf("%d\n", *(ar+1)[0]);
}
要么
void print(int ar[][2]) {
printf("%d\n", ar[0][0]);
printf("%d\n", *(ar+1)[0]);
}
后两个更改*(ar + 1)
的含义。
您的代码可能没有执行您想要的操作。 使用Wall
编译,您将看到一些警告。
您需要更改print
参数以接受2D数组(现在您正在传递int (*)[2]
但函数期望使用int *
),然后可以正确打印值。
#include <stdio.h>
void print (int ar[][2]);
int main () {
int array[2][2] = {
{1,2},
{3,4}
};
print(array);
return 0;
}
void print (int ar[][2]) {
printf("%d\n", ar[0][0]); // 1
printf("%d\n", ar[1][0]); // 4
}
将数组传递给函数时,使用的是“按引用传递”,这意味着您传递了数组的地址。
否。当前传递数组的方式是为函数提供二维数组。
否。您仍然需要指定要从ar [0]打印的数字。
这是因为您要告诉程序转到内存中的数组,然后使用指针算术遍历数组。 例如,如果您有一个包含字符abcde\\0
的char * str
变量,并且想让该字符位于位置2,则可以执行str[2]
或*(str+2)
,这意味着相同的事情,并且两者都给出字符'c'
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.