|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
void main()
{
int a[2][3]={{1,2,3},{4,5,6}};
int *P;
p = a; //这里编译时有错误 ,提示类型不同,有点不明白
printf("%x %x\n",a[1],*(a+1)); //怎么打印出来的地址是一样的呢?
}
问题有两个:1. p = a; //这里编译时有错误 ,提示类型不同,有点不明白
2.*(a+1)这个应该怎么理解?
问了下度娘:
http://zhidao.baidu.com/link?url=IMMrjY2BGDt4xs33lGoNwBdNfgA2lDk74ej9nIUjv9dh90kQ_yTqh136lEd48-abd3fOoVFU2e629uRhVRMeAa
a是二维数组,这里单写一个a可以表示指向一维数组的指针。
我觉得你可能需要:
p = &a[0][0];
就不会有警告了
追问:
1.这里的a不是既是二维数组名,又是二维数组的首地址吗?将地址赋给p应该没有问题呀?
2.如果写成p=a[0];或p=*a;都不会报错,这两个又问什么是正确的呀?
求解!非常谢谢哦~~~!
追答:
确实是地址没错,但是地址也是有类型的。
对于a[0][0]来说,它是第一行第一列的【元素】,所以类型是int
对于a[0]来说,它是第一【行】,所以类型是int [3]
对于a来说,它是整个矩阵,所以类型是int [3][3]
好,现在再来说指针
因为你也知道,在C语言里面指针和数组某种程度上说基本是一样的,于是
对于a[0][0]来说,它还是int
对于a[0]来说,它是int [3] 于是也可以是 int *,和p的类型相同
对于a来说,它是int [3][3] 于是也可以是 (int *)[3],用*对它解引用获得的是 int [3](于是它也可以是int *)于是类型和p相同了。
但是直接 p = a,类型不同,就出警告(在C++下是出错误)
我感觉好难理解哦,希望各位大神帮帮我,先谢谢啦!!!
a[1]是一位数组名,它的值是数组中第一个元素的地址,即a[0][0]的地址
a是二位数组名,它的值也是数组中第一个元素的地址,即一位数组a[0]的地址,而a[0]的地址和a[0][0]的地址是一样的
|
|