C ++使用数组作为多维,尽管使用指针将其初始化为一维

时间:2018-11-02 19:30:23

标签: c++ arrays pointers

此代码可以正常工作。

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(第二个参数)的来源。它不应该给出编译错误吗?

5 个答案:

答案 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数组(如果指针指向数组)。

  

但是随后我们通过编写triangle[i][j] = i + 1;

使用它就像一个2D数组

请记住,下标运算符([])只是语法糖。因此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;