Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将数组作为多维数组使用,尽管使用指针将其初始化为1D_C++_Arrays_Pointers - Fatal编程技术网

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

C++ C++;将数组作为多维数组使用,尽管使用指针将其初始化为1D,c++,arrays,pointers,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 =

显然,这个代码是有效的

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;
}
intmain()
{
常数int size=5;
int*三角形[尺寸],i,j;
对于(i=0;iint*triangle[size]
不是表明这是一个1D数组吗

没错,它是一个一维数组。但它是一个由整数指针组成的一维数组,每个指针都可以指向它自己的
int
数组。因此,尽管你可能会认为这是一个由整数指针组成的一维数组,但通常我们称之为二维数组(如果指针指向数组)

但是我们使用at就像一个2D数组,通过写入
三角形[i][j]=i+1;


请记住,下标运算符(
[]
)只是语法上的糖。因此
x[y]
*(x+y)
完全相同。因此,它真正的意思是
*(三角形[i]+j)
或者,将指针指向索引
i
,将其递增
j
并获取该位置的值,这很有意义,因为您已经为要指向的
triangle[i]
分配了一个动态数组。

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

记住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;

这里的不是二维数组,而是指向
int
s的指针的一维数组,每个指针恰好是另一个数组中的第一个指针

int *triangle[size]
这声明了一个
size
(本例中为五个)指向
int
s的指针数组

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][j]
时,你首先在
triangle
中查找
i
th指向
int
的指针,然后在该指针指向的数组中查找
j
th
int

许多学生起初都在为这个概念而挣扎,但一旦你找到了它,就很容易理解了

int *c[5];   // An array of pointers --> contains 5 pointers 
int **a;     // A pointer to a pointer
int *b       // A pointer
您已经知道,要使b指向数组,我们必须执行以下操作:

int *b = new int[5]; // b points to an array of 5 integers
由于
c
是一个int指针数组(如b),
c[0]、c[1]、c[2]、c[3]、c[4]
是指针。因此我们可以通过初始化所有这些指针来获得“2D数组”,就像您的代码所做的那样:

c[0]=new int[5];/c[0]指向一个由5个整数组成的数组

for (int i = 0; i < 5; i++) {
   a[i] = new int[5]; // these 5 pointers again point to an array of 5 integers
} // in the end, you have a 5x5 array.
现在
a
是指向指针的指针,因此如果要创建“2D数组”,需要将“
a
指向指向整数数组的指针数组”,如下所示:

a=newint*[5];//a指向一个包含5个指针的数组

for (int i = 0; i < 5; i++) {
   a[i] = new int[5]; // these 5 pointers again point to an array of 5 integers
} // in the end, you have a 5x5 array.
for(int i=0;i<5;i++){
a[i]=new int[5];//这5个指针再次指向由5个整数组成的数组
}//最后,您得到了一个5x5数组。

对于练习指针,此注释如何帮助解决我的问题?1D数组可以解释为2D数组,反之亦然。对此有什么不清楚?您可能会感到惊讶,但C/C++中没有N大于1的二维或N维数组。唯一可用的数组类型是一维数组。1D数组可以解释为s是任意维数的nD数组,反之亦然。“您不是在声明一个二维整数数组,而是在声明一个由4个元素组成的数组,其中每个元素都是由3个元素组成的数组。”对我来说,这听起来像是二维数组的定义。如果不是,那么什么是二维数组?@scohe001你可能会发现它纯粹是术语,但对我来说有区别。例如,当你理解这个一维数组的一个元素可以是任何东西,包括另一个数组时,这对这样的问题很有帮助。这就是很好,但我仍然不确定我是否理解你实际上是一个2D数组,如果不是这样的话。你能详细说明吗?@ SCOHE01,对我来说,最重要的是一个类型系统/对象。在“准”-2D数组(数组)上有一行的类型。还有一个对象,您可以获取其地址。对于列,没有对象也没有类型。在真正的二维数组中,行和列都没有类型,或者两者都有类型。我还发现这有助于理解(直观地)为什么一维数组会退化为简单指针,但二维数组不会退化为简单指针到指针。@scohe001或者你可以同时拥有一个类型和一个对象,或者没有。那里会有一个真正的对称性。同样,这纯粹是术语,但我记得这一理解帮助了我,例如,当我我在学C。你是用手画的吗?看起来真的nice@NathanOliver,不,我用了jused。这对像这样的问题很有帮助,因为一张简单的图片可以让事情比文本更清晰。哦,这是一个非常酷的工具。我正在把它添加到我的书签中。看起来有人得到了Asciflow:)@SergeyA嗯,我不能不要尝试:)