二维数组和二级指针的问题

来源:百度知道 编辑:UC知道 时间:2024/06/18 12:48:22
//注VS05平台,XP Sp2系统
#include <iostream>
using namespace std;
//传递一个二维数组
void funArr(bool bArr[][4])
{

//访问第二行第一个元素的值.
cout<<*(*(bArr+1))<<endl;
}
//传递一个二级指针
void funPointer(bool ** bArr)
{
//就是要等到数组的第二列的第一个元素的值.
cout<<*(*(bArr+1))<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
bool bArrY[4][4] = {
{0,0,0,0},
{1,1,1,1},
{0,1,0,1},
{1,0,1,0},
};
cout<< bArrY[2][0]<<endl;
//正确,数组对数组的传递.
funArr(bArrY);
//编译错误.cannot convert parameter 1 from 'bool [4][4]' to 'bool **'
//不是说二维指针和二维数组是等价的吗?为什么编译器不认识?
//funPointer(bArrY);
//强制类型转换后运行错误.
//Access violation reading location 0x01010101.
//既然等价为什么强制转换还不行?
funPointer((bool**)bArrY);
getchar();
return 0;
}
谢谢两位的热心回答,能解释下.为什么二维数组的首地址强制转换成一级指针后,可以正确的访问到指定的元素吗?谢谢.

为什么很多人都认为二维指针和二维数组等价呢,我以前学C时没看到过这话啊.

C语言中数组名相当于一个一级指针,比如int a[5];a就等价于int *.
而二维数组int a[m][n]本质上是长度为m的一维数组,其数组元素是长度为n的一维int数组,因此二维数组的数组名就等价于"长度为n的一维数组类型的指针",即(int *)[n],而不是int **

2维数组实际上是一个数组他的每一个元素都是一个数组,是一个指向bool数组的指针,与指向bool指针的指针不时一回事。
你可以用一个数组的指针(*bArr)[4]来代替它,即是一个指向长度为4的一位数组的指针,**举个例子,char**代替char *argv[argc];就是地址的地址。这些是简单的指针。很多数书都有这么写。