C语言之指向数组的指针
int a[3],*p;
p=a;正确
int b[2][3],**q;
q=b;错误
初学c语言时总会这样声明一个指向二维数组的指针,按一维数组与一级指针的关系,二维数组与二级指针也应该有这样的关系呀,,,,,,,
怎么会错?
要解决这个问题首先让我们来研究下一维数组的数组名与一级指针的含义
int *p表示p是一个指向int类型的指针
int a[3] a是一个数组这个数组中存放的是3个int类型的元素即a是一个有3 个元素的int 类型的一维数组
在c语言中数组名就是数组的首地址,即a指向一维数组的第一个元素
而一维数组的第一个元素a[0]就是一个int类型的变量,而p正是一个指向int类型的指针
So,p=a right
下面让我们看下二维数组b与二级指针q
int **q表示q是一个指针这个指针指向一个int *类型的指针
int b[2][3] b是一个数组这个数组中存放的是2个有3个int元素的一维数组
b就是二维数组的首地址,指向二维数组的第一个元素,二维数组中的第一个元素是?
是int [3]是一个有三个int类型元素的一维数组
所以应该这样声明 int (*q)[3] q是一个指针这个指针指向一个数组这个数组有3个int类型的元素
这样q就是一个指向一个二维数组且第二维为三个int类型元素的指针了
就是说在声明一个指向数组的指针时,确保这个指针能指向数组的第一个元素就行了(把所有的数组当作一维数组来看待,不存在多维数组)
如果非要用多级指针指向一个多维数的话可以这样声明
如
int a[2][3] , **p
p=&a[0][0]
int a[2][3][4] , ***p
p=&a[0][0][0]
那如果数组是100维?
你是不是要写100个*,100个[0] ?
下面让我们来看下这个问题
int **p , (*q)[3], a[2][3]
q=a
p=q
q=p
void add(int **p)
add(q)
开动大脑分析下那个语句是正确的那个是错误的,、 and why ???