c语言复习(三)

来源:互联网 发布:java snmp 流量监控 编辑:程序博客网 时间:2024/05/22 06:49

指针数组与数组指针

一、数组指针

数组指针就是指向数组的指针,相当于是一个二维数组,先看一个例子:

int a[2][2]={1,2,3,4};  //这是一个2*2的二维数组  int (*p)[2];            //数组指针  p=a;                    //令p指向数组a  

int (*p)[2];这里的p是一个数组指针变量。
假如说a中各元素的地址如下:

内存 地址 1 0x0012ff38 2 0x0012ff3c 3 0x0012ff40 4 0x0012ff44

则a和p中各元素的值如下:

名字 值 a 0x0012ff38 a[0] 0x0012ff38 a[1] 0x0012ff40 p 0x0012ff38 p[0] 0x0012ff38 p[1] 0x0012ff38 &a[1][0] 0x0012ff40 &a[0][0] 0x0012ff38 p+1 0x0012ff40 a+1 0x0012ff40 a[0]+1 0x0012ff3c

a是一个数组名,类型是指向一维数组的指针,不是变量,a的值是指针常量,即不能有a++或者a=p这些操作。a指向这块连续空间的首地址,值是&a[0][0]。
a[0]是一维数组名,类型是指向整型的指针,值是&a[0][0],这个值是一个常量。
a[1]是一维数组名,类型是指向整型的指针,值是&a[1][0],这个值是一个常量。
p是一个数组指针变量,指向一维数组的指针变量,值是&a[0][0]。可以执行p++;p=a等操作。
a+1表示指向下一行元素,也可以理解为指向下一个一维数组。
*(a+1)是取出第一行的首地址。
a[0]+1是指向第0行第1个元素,也可以理解为指向一维数组a[0]的第一个元素。
p+1同a+1
(p+1)同(a+1)
虽然a跟a[0]值是一样,但类型不一样,表示的意义不一样。通过分析就不难理解为什么((a+i)+j)和a[i][j]等效了。

二、指针数组

就和整型数组是用来存放整数一样,指针数组是用来存放指针的数组,看下面的例子:

int i=1,j=2;    //p先跟[]结合,然后再跟*结合  int *p[2];      //指针数组,存放指针的数组  p[0]=&i;  p[1]=&j;  printf("%d",sizeof(p));  

此例数组p就两个元素,p[0]是指向i的指针,p[1]是指向j的指针。这两个指针都是int型指针,所以p是存放int型指针的数组。sizeof(p)返回数组占用的总空间,所以程序输出是8

原创粉丝点击