G'day all,
我知道这已经讨论了很多,但我仍然无法找到我需要的东西。我对C很陌生,但我仍然围绕指针,即指向多维数组的指针。
当a是2D数组时,我已经查看了int a[2][3]; int (*p) = a
等示例,但括号有什么作用?
我正在创建一个将2D数组作为变量的程序,它需要将该数组传递给外部函数来修改它。
我的数组是这样初始化的:
unsigned int node[3][2]={ {PINB,PINC}, {0,0}, {0,0} };
我认为最好的方法是通过指针,但我不知道如何设置我的函数的原型,接收2D数组。
这是我传递给它的函数以及我如何调用它:
NodeToMIDI(node, i, pMIDIdata);
这是它的原型://“node_pointer”是2D数组arg。
void NodeToMIDI(unsigned int node_pointer, unsigned int node_select, unsigned int * MidiPacket);
有人可以解释一下如何做到这一点的语法和逻辑。我看过的其他一些线程的语法对我来说是未知的。例如int ** a
。
感谢您的帮助! 安德鲁。
答案 0 :(得分:2)
只有在知道(在编译时)内部数组的大小时,才能自然地传递数组。
您看到的示例可能是int a[2][3]; int (*p)[3] = a
。括号表示p
是指向3个int的数组的指针,而不是指向int的3个指针的数组。由于您可以取消引用像数组这样的指针,因此您可以使用p
,就好像它是一个包含3个整数的数组(a
是)。
以同样的方式,你可以编写像void myfunc(int (*arr)[3]);
这样的原型 - 如果你将a
传递给这个函数,它就像传递数组到函数那样得到指针。
还有另一种方法来编写这个原型:void myfunc(int arr[][3]);
- 编译器会以同样的方式理解它,有些人发现这篇文章更容易理解。
答案 1 :(得分:1)
您正在寻找的签名是:
void NodeToMIDI(unsigned node_pointer[][2], unsigned node_select, unsigned * MidiPacket);
你可以打电话
NodeToMIDI(node, /*something*/, /*something else*/);
答案 2 :(得分:-1)
一些背景资料:
数组的行为有点像指针。如果您有char* name = {"John"};
,则可以访问名称为[2] = h的字符。
名称[0](第一个元素)也与您直接使用指针名称相同。指针name
指的是数组中第一个元素的地址。
因此,数组的数组是...指向指针的指针。这看起来就像你描述的那样。
int ** a;
所以这是一个int指针,它引用另一个引用特定地址的int指针。
因此您可以将unsigned int** arrayOfArray
作为函数参数。
然后,您可以从数组中访问元素。
arrayOfArray[0][2] = 42;