有人能解释我能做的原因:
int x[4] = { 0, 1, 2, 3 };
int *p = x;
但不能这样做:
int x[2][2] = { 0, 1, 2, 3 };
int **p = x;
有没有办法能够分配给** p [] []?
TIA
答案 0 :(得分:8)
指向int int *
的指针可以指向整数数组中的整数,这就是为什么第一个正常;
int x[4] = { 0, 1, 2, 3 };
int *p = x;
这使p
指向x[0]
,x
中的第一个int。
指向指向int int **
的指针可以指向指向int的指针数组中的指针指向int。但是,你的第二个数组不是一个指向int的指针数组;它是一个数组数组。 没有指向int的指针,因此指向int **p
没有任何明智之处。您可以通过两种方式解决此问题。第一个是更改p
的类型,以便它是指向2个数组的指针:
int x[2][2] = { 0, 1, 2, 3 };
int (*p)[2] = x;
现在p
指向x[0]
,int [2]
中的第一个x
。
另一种方法是创建一些pointers-to-int
来指向:
int x[2][2] = { 0, 1, 2, 3 };
int *y[2] = { x[0], x[1] };
int **p = y;
现在p
指向y[0]
,这是int *
中的第一个y
。 y[0]
依次指向x[0][0]
,y[1]
指向x[1][0]
。
答案 1 :(得分:2)
不,没有办法将数组分配给“int **”,因为二维数组是一个数组数组,而不是一个指针数组。
你可以这样做:
int x1[2] = {0, 1};
int x2[2] = {2, 3};
int *x[2] = {x1, x2};
int **p = x;
......也许这可以接受你想要做的事情(取决于当然是什么!)。
更新:如果必须将x保持为二维数组,您还可以执行:int (*p)[2] = x;
,它为您提供指向数组的指针。
答案 2 :(得分:2)
使用指针表示法可以执行此操作
*(p + n)将返回下标n中的值,该值等效于 p [n],“单维数组”
*(*(p + i)+ j)将返回下标i和j中的值 相当于p [i] [j],“双维数组”
这将证明使用数组下标[]根据规则衰减为指针 - 请参阅 ANSI C标准,6.2.2.1 - “表达式中的数组名称由编译器作为指向数组的第一个元素的指针“,此外, ANSI C标准6.3.2.1 - ”下标始终等效于指针的偏移量“,还有 ANSI C标准6.7.1 - ”函数参数声明中的数组名称被视为指向数组中第一个元素的指针 “
如果您不确定如何理解指针和数组是如何工作的,请参阅我的其他answer,它将解释它是如何工作的......
请忽略任何说数组和指针相同的人 - 他们不是......
答案 3 :(得分:2)
无法使用p
有意义地初始化变量x
。为什么?好吧,在你解释你是如何得出这个想法之前,没有办法回答你的问题。 p
的类型为int **
。 x
的类型为int[2][2]
。这是两种不同的类型。你在哪里知道你应该能够将一个分配给另一个?
如果您确实需要通过x
类型的指针访问int **
的元素,则必须间接执行此操作。您必须创建一个额外的中间数组,该数组将保存指向连续数组x
的第一个元素的指针:
int *rows[2] = { x[0], x[1] };
现在您可以将p
指向此中间数组的开头
int **p = rows;
现在,当您评估p[i][j]
时,您会获得x[i][j]
。
如果没有中间数组,就无法直接进行。
答案 4 :(得分:1)
如果你真的使用的是c ++而不是c,你可以使用std :: vector(或其他一些集合类型)来获得这种效果。
typedef std::vector<std::vector<int> > intmatrix;
intmatrix x;
intmatrix::iterator p = x.begin();
或其他一些。
答案 5 :(得分:1)
所有关于标准转换规则($ 4.2)
“n的数组”类型的左值或右值 T“或”T的未知界限的数组“ 可以转换为类型的右值 “指向T.”的结果是 指向第一个元素的指针 阵列。
od
和td
的类型分别为
char [3]
char [1][3]
这意味着od
的类型'数组为3个字符'(N = 3,T = char)。
因此,根据上面的引用,它可以转换为“指向char的指针”
因此char *p = od;
格式正确
类似地,od
的类型是'1个3个字符数组的数组'(N = 1,T = 3个字符的数组)。
因此,根据上面的引用,它可以转换为“指向3个字符数组的指针”
因此char (*p)[3] = td;
格式正确
有没有办法可以分配给 ** p x [] []?
没有。因为有效td[x][y]
和x
的{{1}}类型为y
。所以你真正能做的是char
。