|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
int main(){
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int (*p)[4];
p=a;
printf("%d\n",p); //结果为 6487520
printf("%d\n",*p); //结果为 6487520
printf("%d\n",**p); //结果为 1
printf("%d\n",&a[0]); //结果为 6487520
printf("%d\n",a[0]); //结果为 6487520
printf("%d\n",*a[0]); //结果为 1
a[3][4]看做:含a[0],a[1],a[2]三个元素的一维数组。
而对于数组在定义及初始化时,是int *z=b1,
其实是int *z=&b1,即把b1首元素的地址存放进了指针的内存单元,
那么考虑数组的时候就是 &数组名(如b1)=数组名(b1),
所以 &a[0]=a[0];----式1
( 即a[0]这个一维数组第一个元素即a[0][1]的地址)
而p指向a这个含有a[0]a[1]a[2]三个元素的一维数组,
也即p=&a[0](此时看作元素)
把式1带入得p=a[0],即为a[0][1]的地址,
同时*p=*&a[0] (*&为互逆运算)
所以*p=a[0],和p一样都是a[0][1]的地址,所以输出结果相同。
我这么完全没经过计算机的类似数学公式的代换问题大吗。。或者说这么理解对吗。。
蠢萌新,求大佬讲解一下具体的机理 |
|