在Objective-C中声明一个具有已定义数组大小的函数

The*_*Art 2 c arrays function

我确信这是一个非常愚蠢的问题,但它确实让我措手不及,可能是因为我没有正确地思考这个问题.在使用OpenGL ES 2.0时,我遇到了以下代码

/////////////////////////////////////////////////////////////////
// Forward declarations
static void SceneMeshInitIndices(
   GLushort meshIndices[NUM_MESH_INDICES]);
static void SceneMeshUpdateNormals(
   SceneMeshVertex mesh[NUM_MESH_COLUMNS][NUM_MESH_ROWS]);
static void SceneMeshUpdateMeshWithDefaultPositions(
   SceneMeshVertex mesh[NUM_MESH_COLUMNS][NUM_MESH_ROWS]);
Run Code Online (Sandbox Code Playgroud)

现在,让我措手不及的是,函数将其输入声明为具有特定大小的2D数组.我从来没有见过这样做过,我完全不确定它是否合法或者它在Objective-C中是如何合法的.我总是被告知要使用指向原始数组的指针并将其传入.但是,这看起来很奇怪.任何人都可以尝试向我解释这一点,或指出我推断的错误是什么?

小智 7

将数组传递给函数时,它们会根据一组规则衰减为指针.这些是:

一.第一级间接(即数组的第一维/索引)衰减为指针,因此不需要指定其大小(也不使用它).

二.阵列的其他尺寸保持不变,并且不会衰减成指针.需要指定它们,它们是参数类型的一部分.

这就是为什么基本上以下是等价和合法的:

void foo(int arr[]);
void foo(int arr[MAX_ARRAY_SIZE]);
void foo(int *arr);
Run Code Online (Sandbox Code Playgroud)

但以下不是等同的,但是合法的:

void foo(int arr[MAX_ROWS][MAX_COLUMNS]);
void foo(int **arr);
Run Code Online (Sandbox Code Playgroud)

以下是同等和合法的:

void foo(int arr[MAX_ROWS][MAX_COLUMNS]);
void foo(int arr[][MAX_COLUMNS]);
Run Code Online (Sandbox Code Playgroud)

(这些被解释为int (*arr)[MAX_COLUMNS]),即作为指向数组的指针).

以下是非法的,即它会生成编译器错误:

void foo(int arr[MAX_ROWS][]);
Run Code Online (Sandbox Code Playgroud)