此代码可以正常工作。
int main()
{
const int size = 5;
int *triangle[size], i, j;
for (i = 0; i < size; i++){
triangle[i] = new int[i + 1];
for (j = 0; j < i + 1; j++)
triangle[i][j] = i + 1;
}
for (i = 0; i < size; i++){
for (j = 0; j < i + 1; j++)
cout << triangle[i][j];
cout << endl;
}
for (i = 0; i < size; i++)
delete [] triangle[i];
return 0;
}
它给它输出 1个 22 333 4444 55555
但是没有写int*triangle[ size]
表示那是一维数组,我们没有指定第二个参数。但是后来我们通过写triangle[i][j] = i + 1;
使用它就像一个2D数组,我不明白j(第二个参数)的来源。它不应该给出编译错误吗?
答案 0 :(得分:6)
int *triangle[size]
是一个指针数组。在您的for循环中,您这样做
triangle[i] = new int[i + 1]
设置每个指针指向一个数组。我们把它们放在一起,
triangle[i][2]
+ +
| +> access the element of the array the ith pointer points to
|
+-> Accesses the ith pointer
答案 1 :(得分:3)
这里没有二维数组。这是一个指向for key, value in sample.iteritems():
print(key, value)
的指针的一维数组,每个指针恰好是另一个数组中的第一个指针。
int
这声明了int *triangle[size]
的{{1}}(在本例中为五个)指针的数组。
size
在此循环中,int
分配了一个for (i = 0; i < size; i++){
triangle[i] = new int[i + 1];
for (j = 0; j < i + 1; j++)
triangle[i][j] = i + 1;
}
triangle[i] = new int[i + 1]
s数组,并将指向其第一个元素的指针存储在i + 1
中。
最后,您将获得以下结构:
int
访问triangle[i]
时,您首先要在triangle
+---+
| | +---+
| +--->+ 1 |
| | +---+
+---+
| | +---+---+
| +--->+ 2 | 2 |
| | +---+---+
+---+
| | +---+---+---+
| +--->+ 3 | 3 | 3 |
| | +---+---+---+
+---+
| | +---+---+---+---+
| +--->+ 4 | 4 | 4 | 4 |
| | +---+---+---+---+
+---+
| | +---+---+---+---+---+
| +--->+ 5 | 5 | 5 | 5 | 5 |
| | +---+---+---+---+---+
+---+
中查找指向triangle[i][j]
的第i
个指针,然后查找第int
{ {1}}在该指针指向的数组中。
答案 2 :(得分:2)
但是不是写
int*triangle[ size]
表示那是一维数组吗?
您是对的,它是一维数组。但这是一个由整数指针组成的1D数组,并且(损坏指示器警报)每个指针都可以指向其自己的int
数组。因此,尽管您可能会认为这是一维整数指针数组,但通常我们将其称为2D数组(如果指针指向数组)。
但是随后我们通过编写
使用它就像一个2D数组triangle[i][j] = i + 1;
请记住,下标运算符([]
)只是语法糖。因此x[y]
与*(x+y)
完全相同。所以真正的意思是*(triangle[i]+j)
,或者将指针指向索引i
,将其递增j
,然后在该位置获取值,这是有意义的,因为您已经分配了一个triangle[i]
指向的动态数组。
答案 3 :(得分:2)
许多学生一开始就对这个概念感到困惑,但是一旦掌握了它,就很容易感到困惑。
# Change output3 to output4
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /libros /output4
您已经知道要使b指向数组,我们必须执行以下操作:
int *c[5]; // An array of pointers --> contains 5 pointers
int **a; // A pointer to a pointer
int *b // A pointer
由于int *b = new int[5]; // b points to an array of 5 integers
是 int指针的数组(如b),所以c
是指针。因此,我们可以通过初始化所有这些指针来获得“ 2D数组”,就像您的代码一样:
c[0], c[1], c[2], c[3], c[4]
现在c[0] = new int[5]; // c[0] points to an array of 5 integers
是指向指针的指针,因此,如果要创建“ 2D数组”,则需要使“ a
指向一个指针数组,该指针指向一个数组”整数”,例如:
a
a = new int*[5]; // a points to an array that holds 5 pointers
答案 4 :(得分:1)
记得在C / C ++中没有2(3、4、5,N ...)维数组是有帮助的。唯一可用的数组是一维数组。
将数组声明为
int x[3][4];
您不是在声明一个二维整数数组。而是声明了一个由4个元素组成的数组,其中每个元素都是由3个元素组成的数组。
相反,您可以声明一个指向整数的指针数组:
int* x[4];
现在,每个指针都可以指向单个整数或整数序列中的第一个元素。由于数组可以转换为指向其元素的指针,因此这是有效的代码:
int* x[2];
int x1[3];
int x2[3];
x[0] = x1;
x[1] = x2;