指针数组:首先是一个数组,数组中的元素为指针。所占内存由元素个数决定。
数组指针:首先是一个指针,该指针指向一个数组,所占内存在32位系统下为4字节(地址占字节数)。
eg:
int *p1[10];//指针数组,数组中的元素为指向一个整型数据的指针。
int (*p2)[10];//数组指针
说明:p1与[]构成一个数组,数组名为p1,int * 修饰数组内容,即数组中存的是指向整型数的指针。p2与*构成一个指针,p2为指针变量名,int修饰数组内容。p2为一指针,指向一个包含10个整型数据的数组。
#include <stdio.h>
void main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a+1);
printf("%d,%d\n",*(a+1),*(ptr-1));
printf("%x\n",&a+1);//地址的强制类型转换
printf("%x\n",(unsigned long)(&a)+1);
printf("%x\n",(unsigned long*)(&a)+1);
while(1);
}
输出结果如图所示:
*(a+1)表示a[1]的值,*(ptr-1)表示a[4]的值。
&a+1:数组a首地址加1,指向下一个数组,即a[5]。结果为:0x0019fa24+5*sizeof(int)=0x0019fa38
(unsigned long)(&a)+1:把数组a的首地址强制转换成一个长整型数,再加1,为长整形数加1。即在&a的值的基础上加1。0x0019fa24+1=0x0019fa25
(unsigned long*)(&a)+1: 把数组a的首地址强制转换成一个地址,再加1,地址是占4个字节,所以结果为:0x0019fa24+4=0x0019fa28
#include <stdio.h>
void main()
{
char a[5] = {'A','B','C','D'};
char (*p1)[5] = &a;
char (*p2)[5] = a;
char (*p3)[3] = &a;
char (*p4)[3] = a;
char (*p5)[10] = &a;
char (*p6)[10] = a;
while(1);
}
p1、p2、p3、p4、p5、p6都为数组指针,当把&a赋值给他们时,在下标相同的情况下,因为&a表示数组a的首地址,而p1也是指向一个5个字符元素的指针,两边类型完全相同,不会有警告。而把a赋值给p2时,因为a表示的是首元素的首地址,表示一个元素的地址,而不是数组的地址,当赋值给p2指向一个5个元素的数组的指针时,=两边类型不一致,有警告。当数组元素个数不相同时,也是有同样的警告。p1、p2、p3、p4、p5、p6分别加1的结果如下图所示:
+1是加的n*sizeof(char),n表示p1、p2、p3、p4、p5、p6指向的数组中元素的个数。
在分析二维数组和指针时,要学会画内存布局图。
文章评论(0条评论)
登录后参与讨论