#include <stdio.h>
void Fun(char b[3][10])
{
......
}
void main()
{
char a[3][10];
Fun(a);
}
问题:对于二维数组来说,a,a[0],&a[0],&a[0][0]都指二维数组首地址,但在函数调用时,却只能用a和&a[0]作为参数,其它均会出现编译错误,这是为什么?
----------------解决方案--------------------------------------------------------
[QUOTE]问题:对于二维数组来说,a,a[0],&a[0],&a[0][0]都指二维数组首地址,但在函数调用时,却只能用a和&a[0]作为参数,其它均会出现编译错误,这是为什么?[/QUOTE]
a是个数组指针 相当 char (*ptr)[10]
a[0] 相当 *(ptr+0)
&a[0] 相当 &(*(ptr+0))=ptr+0
&a[0][0] 自己想是什么
----------------解决方案--------------------------------------------------------
数组首地址=数组第0行首地址=数组第0行第0列的地址
*(ptr+0)就是第0行首地址应该同ptr+0是一样的吧?
&a[0][0]是不是应该相当于*(ptr+0)+0,表示第0行的首地址?应该也同上一样吧?
如果用printf显示a,a[0],&a[0],&a[0][0]的值都是一样的呀,函数调用时不是只要获得数组首地址就行了吗?
----------------解决方案--------------------------------------------------------
问题:对于二维数组来说,a,a[0],&a[0],&a[0][0]都指二维数组首地址,但在函数调用时,却只能用a和&a[0]作为参数,其它均会出现编译错误,这是为什么?
应该跟你的函数有关吧,我用哪种方式调用都不会出错呀。
----------------解决方案--------------------------------------------------------
a是个数组指针 相当 char (*ptr)[10]
而&a[0][0] 是个char元素的地址 相当char *
你的void Fun(char b[3][10])相当 void Fun(char (*ptr)[10])
----------------解决方案--------------------------------------------------------
[QUOTE]a,a[0],&a[0],&a[0][0]都指二维数组首地址[/QUOTE]但是数据类型并不一样
----------------解决方案--------------------------------------------------------
不好意思,我还是有些不明白:都是char型吗,为什么说数据类型不一样呢?
----------------解决方案--------------------------------------------------------
#include<stdlib.h>
#include<stdio.h>
int main()
{
char a[3][3]={'a','b','c','d','e','f','g','h','j'};
char (*ptr)[3];
char *ptr1;
ptr1=&a[0][0];
ptr=a;
printf("ptr=%c ptr1=%c\n",**ptr,*ptr1);
ptr1++;
ptr++;
printf("ptr=%c ptr1=%c\n",**ptr,*ptr1);
return 0;
}
----------------解决方案--------------------------------------------------------
非常感谢knocker兄孜孜不倦的指教!
从结果上看a与&a[0]是同一类型,而&a[0][0]与a[0]是同一类型。可是为什么会是这样的结果,应如何理解呢?
----------------解决方案--------------------------------------------------------