C / C ++数组初始化程序问题

时间:2010-09-07 01:24:58

标签: c++ c arrays

有人能解释我能做的原因:

int x[4] = { 0, 1, 2, 3 };
int *p = x;

但不能这样做:

int x[2][2] = { 0, 1, 2, 3 };
int **p = x;

有没有办法能够分配给** p [] []?

TIA

6 个答案:

答案 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 *中的第一个yy[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.”的结果是   指向第一个元素的指针   阵列。

odtd的类型分别为

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