一维数组:
这里我们定义一维数组和一些其他变量予以区分。
char ar[10]={};
char (*p)[10]=&ar;
char *pt=ar;
//1
printf("%d \n",sizeof(ar));
//2
printf("%d %d %d %d \n",ar,*ar,ar+1,*ar+1);
//3
printf("%d %d %d %d \n",&ar,*&ar,&ar+1,*&ar+1);
//4
printf("%d %d %d %d\n",pt,*pt,pt+1,*pt+1);
//5
printf("%d %d %d %d %d %d\n",p,*p,**p,p+1,*p+1,**p+1);
我们定义一个开辟四个整型空间的一维数组ar。这里我信printf函数没有信监视器。
这里我们来看1行,sizeof(ar)得出来的值都应该是16(4*sizeof(int))。这里是数组名的第一个特殊处,对数组名使用sizeof计算时,计算整个数组的字节大小。
再看2行,这里所打印的四个值按顺序为
1、数组名的地址(char *类型)
2、对数组首元素取值,所以是0(初始化都为0)(char类型)
3、 数组下标为1的元素的地址(这里的ar表明为数组首元素的地址)(char *类型)
4、这里*ar是char类型1这里编译器认为是int型,所以两者相加为int型,用sizeof计算为4字节(int类型),结果是1
再看3行:
1、&ar是取数组名的地址,这个值还是数组名的地址,值一样(char[10]*)
2、先&ar取数组的地址,在*后就是数组名本身
3、&ar取数组的地址+1,加(sizeof(char)*10)的字节大小
4、*ar是取首元素类型char取&,是取首元素的地址,+1是走到了数组下标为1的元素的地址。
这里当对sizeof使用时有特殊表示。
再看4行
1、pt是一个整型指针存储数组首元素的地址
2、*pt是数组的第一个元素的值
3、pt+1是在数组下标为1的元素的地址
4、*pt+1是先取数组的首元素,char类型+1结果是int类型,结果是1
再看5行
1、p是指向一个开辟了10个int类型的数组,这里p指向数组的首地址。
2、*p指向数组的首元素的地址 (char星)
3、**p指向数组的首元素char类型
4、 p+1指向下一个数组的首地址
5、*p+1,这里是星p是数组的首元素的地址+1表明是数组下标为1的元素的地址
6、**p+1,这里星星p是取首元素是char类型+1的结果是1(int类型)
二维数组
int main()
{
char ar[3][4]={};
char (*p)[3][4]=&ar;
char (*br)[4]=ar;
//1
printf("%d \n",sizeof(ar));
//2
printf("%d %d %d %d %d %d \n",ar,*ar,**ar,ar+1,*ar+1,**ar+1);
//3
printf("%d %d \n",&ar,&ar+1);
//4
printf("%d %d %d %d %d %d %d %d \n",p,*p,**p,***p,p+1,*p+1,**p+1,***p+1);
//5
printf("%d %d %d %d %d %d \n",br,*br,**br,br+1,*br+1,**br+1);
return 0;
return 0;
}
这里我们来看看这些显示出来的值都是什么:
我们来看1行所显示
1、数组名的一个特殊处,用sizeof时是,计算整个数组的字节大小
结果是12(无符号整型)
再来看2行
1、ar在这里是表示二维数组首元素的地址(首元素是一个一维数组)
2、*ar表示指向二维数组首元素一维数组的首元素地址
3、**ar表示二维数组首元素一维数组的首元素,char类型
4、ar+1这里加1是加了一个元素的字节大小,二维数组的元素是一维数组,这里就加了4字节。
5、*ar+1这里加1是加了一个char的大小
6、**ar+1这里是char类型与int类型的运算结果是1(类型int)
再来看3行
1、这里&ar表示的二维数组的地址
2、加1是加一个二维数组的大小,也就是加12字节
再看4行
1、这里的p也是一个数组名的特殊,这里p表示整个二维数组的地址
2、*p这里表示二维数组的首元素的地址
3、**p这里表示就是二维数组的首元素一维数组的首元素的地址
4、***p表示是char类型是二维数组的首元素一维数组的首元素
5、p+1这里表示加整个数组的大小
6、*p+1加的是二维数组的元素一维数组的大小
7、**p+1是加一个一维数组的元素大小一个char类型
8、***p是一个char类型加一个int类型结果是1(int类型)
这里看5行
1、这里br代表二维数组的首元素一维数组的地址
2、这里就表示一维数组的首元素的地址
3、这里就是char类型了
4、br+1这里加1是加一个一维数组的大小
5、这里加1是加一个char的大小
6、这里就是char类型数据加int类型数据结果是1(类型int)
数组指针,指针数组
char *(*p)[3][4]=NULL;
printf("%d %d %d %d %d \n",sizeof(p),sizeof(*p),sizeof(**p),sizeof(***p),sizeof(****p));
我们再来看看,我们定义了一个指针 该指针指向一个三个元素的二维数组,每个元素是4个元素的一维数组,每一个一维数组的元素是char*。
这里的显示
1、这里p的类型是(char*[3][4]*),指向一个指针类型的二维数组。
所以计算就是算指针,大小为4,若加1自然是加整个二维数组的大小
2、*p这里就是指向二维数组的首元素地址,由于是使用sizeof特殊处理按照整个数组大小来算结果是48,二维数组的首元素地址就是一维数组的地址,若加1其结果是加一维数组的大小
3、**p这里表示一维数组的首元素地址,使用sizeof特殊处理计算一维数组的大小,结果是16,若加1表示加一个一维数组的元素的大小。
4、**p这里就是一维数组的元素了,也就是char类型,sizeof计算就是计算指针,结果是4,加1也就是加一个指针的大小
5、***p这里就是一维数组的元素char类型所指向的char类型,计算就是算char,结果是1,加1就是char与int的加和计算