可以放的事多的时间段能踢你和你一起玩要送到时候再说吧晚上回来吗丁啉
1.我们先来看如下的一个例子:
#include<stdio.h> #include<stdlib.h> int main() { char a[5]={'A','B','C','D'}; char (*p3)[4]=&a; char (*p4)[5]=a; system("pause"); return 0; }
.我们知道p3和p4都是数组指针,他们都是有能力指向一个整形数组的,可是对于p3还是p4他们的类型是char (*)[4]和char (*)[5],不管对他们进行赋值&a还是a都是不能编译通过的,除非类型转化,下面我们来看强制类型转化之后的代码.
#include<stdio.h> #include<stdlib.h> int main() { char a[5]={'A','B','C','D'}; char (*p3)[4]=(char (*)[4])&a; char (*p4)[5]=(char (*)[5])a; system("pause"); return 0; }
.在强制类型转化之后编译没有报错,可是如果p3+1,p4+1指向的是数组的哪块位置呢?
.我们可以知道p3+1指向的是D之后的那块空间,因为p3赋值的是整个数组的地址,p3向后偏移就是偏移所有的数组元素;当然p4+1指向的就是B的空间啦!
2.我们再来看可以可以更好的理解指针数组和数组指针区别的例子:
已知结构体Test的大小是20个字节,假设p的地址为0x10000000,
#include<stdio.h> #include<stdlib.h> struct Test { int Num; char *pcName; short cha[2]; short sBa[4]; }*p; int main() { printf("%p\n",p+0x1); printf("%p\n",(unsigned long)p+0x1); printf("%p\n",(unsigned int *)p+0x1); system("pause"); return 0; }
结果为:
0x10000014 0x10000001 0x10000004
.p+0x1
.我们知道p是结构体类型的指针,它有点类型于刚才的数组指针p3+1,p向后偏移1说明偏移了一个结构体类型,而结构体的大小是20个字节,就是p在原来的地址基础上向后便宜了20个字节,转化成16进制就是加14;
.(unsigned long)p+0x1
.在这里我们把结构体类型的指针强制类型转化成unsigned long 类型的相当于把一个结构体类型的指针强制类型转化unsigned long类型的数字,向后偏移一个就是在原来的基础上加1.
.(unsigned int *)p+0x1
.在这里我们应用了强制类型转换,我们把结构体类型的指针p强制转换成unsigned int *类型,我们知道只要是指针,内存就给它分配四个字节,所以当强制类型转换之后的p偏移1时,p在原来地址的基础上偏移4个字节.
指针数组和数组指针对于初学者来说很难理解,但是只要你认真思考把握理解物质的本质就会变得很好理解啦!