原创 数组指针、指针数组

2012-9-18 16:23 1381 12 12 分类: 软件与OS 文集: C语言深度解剖

指针数组:首先是一个数组,数组中的元素为指针。所占内存由元素个数决定。

数组指针:首先是一个指针,该指针指向一个数组,所占内存在32位系统下为4字节(地址占字节数)。

eg:

int *p1[10];//指针数组,数组中的元素为指向一个整型数据的指针。

int (*p2)[10];//数组指针

说明:p1与[]构成一个数组,数组名为p1,int * 修饰数组内容,即数组中存的是指向整型数的指针。p2与*构成一个指针,p2为指针变量名,int修饰数组内容。p2为一指针,指向一个包含10个整型数据的数组。

  1.  

#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);

}

 

1.jpg

输出结果如图所示:

*(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

  1.  

#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);

}

 

2.jpg

p1、p2、p3、p4、p5、p6都为数组指针,当把&a赋值给他们时,在下标相同的情况下,因为&a表示数组a的首地址,而p1也是指向一个5个字符元素的指针,两边类型完全相同,不会有警告。而把a赋值给p2时,因为a表示的是首元素的首地址,表示一个元素的地址,而不是数组的地址,当赋值给p2指向一个5个元素的数组的指针时,=两边类型不一致,有警告。当数组元素个数不相同时,也是有同样的警告。p1、p2、p3、p4、p5、p6分别加1的结果如下图所示:

 

3.jpg·

+1是加的n*sizeof(char),n表示p1、p2、p3、p4、p5、p6指向的数组中元素的个数。

      在分析二维数组和指针时,要学会画内存布局图。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
12
关闭 站长推荐上一条 /3 下一条