显然这段代码有效
void printD(int * ar,int r)
{
for(int i = 0; i < r; i++)
cout<<ar[i]<<endl;
}
int main()
{
int ar[3] = {1,2,3};
printD(ar,3);
return 0;
}
但是这段代码不起作用
void print2D(int ** ar,int r,int c)
{
for( int i = 0; i< r;i++)
for(int j = 0; j < c;j++)
cout<<ar[i][j]<<endl;
}
int main()
{
int ar2[1][2] = {{3,1}};
print2D(ar2,1,2);
return 0;
}
我不明白为什么这不起作用?
最佳答案
问题在于如何计算内存地址。 a[0]
是第一个元素,a[1]
是第二个元素,所以a[1]
的地址是a[0]
的位置加上元素的大小。这里没问题,任何元素的地址都可以通过第一个元素的位置乘以偏移量乘以元素大小来计算。
这如何处理多维数组? a[0][5]
和 a[1][5]
之间的距离是多少?好吧,这取决于行的大小(为了这个例子我使用这个术语,实际上,没有任何“行”),因为最后它只是一个内存块。如果一行有 10 个元素,则距离是元素大小的 10 倍。所以这个行大小很重要,没有它就无法计算元素在数组中的确切位置。现在在这里:
void print2D(int ** ar,int r,int c)
它怎么知道行的大小? ar[1][0]
是第二行的第一个元素,所以如果一行的大小为 10,那么它就是内存块中的第 10 个元素。但是,如果行大小为 20,那么它将是第 20 个元素,这将是一个不同的地址。那它怎么知道呢?
该代码不起作用,因为它需要信息来计算地址,但它没有该信息。
关于c++ - 为什么我不能将二维数组作为指针传递给指针,但可以将一维数组作为指针传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53443007/