设置指向2D数组的指针,然后将该指针传递给函数

时间:2012-02-23 13:03:28

标签: c arrays pointers parameter-passing

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

感谢您的帮助! 安德鲁。

3 个答案:

答案 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;