C 'int*userMask[3][4]`指向什么?

C 'int*userMask[3][4]`指向什么?,c,arrays,pointers,C,Arrays,Pointers,我正在修改一些代码,遇到一个声明,我理解起来有困难: int *userMask[3][4] = {0}; 这到底指的是什么?它是一个每个元素都是指针的矩阵吗?还是指向[3][4]大小的矩阵 谢谢 我想我的问题是当userMask[2][maskElement][user]被声明为int时,它是如何工作的。用户掩码不是必须是int[]才能正常工作吗?我一定不明白这是对的 另一方面,感谢您对cdecl Robert的建议。但是,有人知道如何在XP命令提示符中使用它吗?我能得到的只是语法错误:(

我正在修改一些代码,遇到一个声明,我理解起来有困难:

int *userMask[3][4] = {0};
这到底指的是什么?它是一个每个元素都是指针的矩阵吗?还是指向[3][4]大小的矩阵

谢谢


我想我的问题是当
userMask[2][maskElement][user]
被声明为
int
时,它是如何工作的。用户掩码不是必须是
int[]
才能正常工作吗?我一定不明白这是对的


另一方面,感谢您对cdecl Robert的建议。但是,有人知道如何在XP命令提示符中使用它吗?我能得到的只是语法错误:(

这是一个二维数组,其中每个元素都是指向
int
的指针,所有指针都初始化为零

在后续操作中,您将显示阵列的使用方式如下:

if(userMask[2][maskElement][user] && blah)
    result = true;
type variablename[array_spec];
在这种情况下,
userMask
中的每个元素实际上应该指向一个
int
s数组。(一个
int*
可以指向一个
int
或一个
int
s数组)。要确定这一点,请检查为
userMask
赋值的代码。例如,可以编写:

int userArray[2] = { 10, 20 };

userMask[0][0] = userArray; // userMask[0][0] points to the
                            // first element of userArray.
然后,以下代码索引到
userArray

int value = userMask[0][0][1]; // sets value = userArray[1], giving 20.

它是一个矩阵,其中每个元素都是指针

如果它指向一个大小为[3][4]的矩阵,那么代码应该是

int userMask[3][4]={0};
是一个二维数组,其中每个成员都是指向int的指针。此外,所有成员都初始化为空指针

int (*userMask)[3][4];
int* i;
int the_int_behind_i = *(i+1);
int also_the_int_behind_i = i[1];
将是指向整数的二维数组的指针。C中的括号比*紧,因此需要括号来创建指向数组的指针

cdecl
是一个简单的实用工具,您可以下载它来解释复杂的声明:

cdecl> explain int *userMask[3][4]
declare userMask as array 3 of array 4 of pointer to int
它也可以做相反的事情:

cdecl> declare userMask as pointer to array 3 of array 4 of int
int (*userMask)[3][4]

我认为该语句访问usermask数组的第三行,然后访问该行中MaskeElement的第四个指针,因为这是一个int指针,它可以指向int数组的开头(想想字符串),我假设它正在这样做,并且该数组由用户进行子索引。

usermask[2]
的类型为
int*[]

userMask[2][maskElement]
的类型为
int*

因此,
userMask[2][maskElement][user]
的类型是
int

宣言

int *userMask[3][4] = {0};
是的缩写

int *userMask[3][4] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
其中每个零隐式转换为
(int*)0

简短答案 给定的userMask声明为

int *userMask[3][4];
然后,
userMask
有类型
int*[3][4]
。它是指向int的指针的2d数组。外部维度的大小是3,内部维度的大小是4。实际上,这只是一个3元素1d数组,哪个元素类型是另一个4元素1d数组,哪个元素类型是
int*

说明的步骤 所以如果你这样做了

userMask[2][maskElement][user]
然后基本上使用前两个索引从2d数组中选取特定指针:

int * p = userMask[2][maskElement];
然后通过执行以下操作,从该指针的某个偏移位置拾取一个int

p[user]
现在代码都在
userMask[2][maskElement][user]
中了

有效的C代码 要使用有效的c代码一步一步地执行此操作(如果您还不了解下面的所有内容,请不要担心):

数组和指针之间的区别 因此,我想我向您展示一些重要的东西。上面的数组不包含指向数组的指针。让我们看看它们的行为有多不同,这是许多c程序员所不期望的:

int array[5][4][3];
/* int[4][3] implicitly converts to int(*)[3] (pointer to first element) */
int (*parray)[3] = array[0]; 
int ** pint = (int**) array[0]; /* wrong!! */
现在,如果我们做
parray[1]
pint[1]
,会发生什么?第一个将通过
sizeof(int[3])
字节(
3*sizeof(int)
)来推进parray,第二个将仅通过
sizeof(int*)
字节。因此,实际上,第一个将为您提供正确的数组
array[0][1]
,第二个将为您提供
(char*)数组[0]+sizeof(int*)
,这是我们不希望它出现的地方。但是获取错误的偏移量并不是全部。因为它不知道访问了数组,它将尝试解释
pint[1]处的内容
作为一个
int*
。假设你的数组是用
0x00
初始化的。然后它将根据地址0x00执行下一个索引步骤(例如执行
pint[1][0]
)。哦,不-完全没有定义的行为!因此强调差异非常重要

结论
这比您要求的要多,但我认为了解这些细节非常重要。特别是如果您想将2d数组传递给函数,那么这些知识非常有用。

如果您像这样阅读,它会有所帮助:

if(userMask[2][maskElement][user] && blah)
    result = true;
type variablename[array_spec];
在这种情况下: int*用户掩码[3][4]

所以它是int*的矩阵

现在,由于c不区分指针和数组,所以可以对指针使用数组索引

int (*userMask)[3][4];
int* i;
int the_int_behind_i = *(i+1);
int also_the_int_behind_i = i[1];
这需要我指向一个区域,在这个区域中,几个整数排成一行,当然,就像一个数组

请注意,上一个示例中使用的索引运算符[]与第一个示例中的array_spec类似,但两者完全不同

So:userMask[2][maskElement][user]


选择存储在[2][maskElement]的usermask指针,并为用户计算它应用由内而外规则

int *userMask[3][4] = {0};
从声明的内部Post部分开始

userMask
名字是什么

userMask[3] 
为其中的3个分配空间(是向量)

userMask[3][4] 
为4个
用户掩码[3]
分配空间

int *
告诉我们
userMask
项是指向
int

然后,
={0}
是一个初始值设定项,其中所有元素都是
0

int *userMask[3][4] = {0};
是int*的3x4数组,初始化为0

if(userMask[2][maskElement][user] && blah)
   result = true;
这里的第二部分是C中没有数组,只有指针运算。根据定义,
p[i]
总是等同于
*(p+i)

userMask[2][maskElement][user]
相当于

*((userMask[2][maskElement])+user)
代码在某个地方分配了一个向量(我敢打赌它来自malloc(3c)或