指针数组,数组指针,以及二维数组

来源:互联网 发布:seo顾问服务微博 编辑:程序博客网 时间:2024/06/07 03:03

看到两个名字只能感慨汉字强大,不过从英文,中文全称来看,很容易理解。

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组     

                 表示:数组a中的元素都为int型指针    

                 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针     

                 表示:指向数组a的指针

                 元素表示:(*a)[i]  

接着说二维数组,刚学指针时,觉得指针来表示数组,只能用上面两个中的一个(因为往往分不清,所以也不知道具体是哪个),其实两个都可以,
下面就是例子:

#include <stdio.h>main(){    static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};/* 定义二维数组m并初始化*/     int (*p)[4];//数组指针  p是指针,指向一维数组,每个一维数组有4个int元素    int i,j;    int *q[3];//指针数组 q是数组,数组元素是指针,3个int指针    p=m;    //p是指针,可以直接指向二维数组    printf("--数组指针输出元素--/n");    for(i=0;i<3;i++)/*输出二维数组中各个元素的数值*/    {        for(j=0;j<4;j++)         {            printf("%3d ",*(*(p+i)+j));        }        printf("/n");    }    printf("/n");    for(i=0;i<3;i++,p++)//p可看成是行指针    {        printf("%3d ",**p);//每一行的第一个元素        printf("%3d ",*(*p+1));//每一行的第二个元素        printf("%3d ",*(*p+2));//每一行的第三个元素        printf("%3d ",*(*p+3));//每一行的第四个元素        printf("/n");    }    printf("/n");    printf("--指针数组输出元素--/n");    for(i=0;i<3;i++)        q[i]=m[i];//q是数组,元素q[i]是指针    for(i=0;i<3;i++)    {        for(j=0;j<4;j++)        {            printf("%3d ",q[i][j]);//q[i][j]可换成*(q[i]+j)        }        printf("/n");    }    printf("/n");    q[0]=m[0];    for(i=0;i<3;i++)    {        for(j=0;j<4;j++)        {            printf("%3d ",*(q[0]+j+4*i));        }        printf("/n");    }    printf("/n");    }

当你看到这里,或许你还是迷糊,感觉还是会搞混,那么这里还有一个方法。

右左法则

右左法则常常用来分析复杂申明;

右左法则的大致描述为:从未定义的变量名开始阅读声明,先向右看,然后向左看。当遇到括号时就调转阅读的方向。括号内的所有内容都分析完毕就跳出括号。这样一直继续下去,直到整个声明都被分析完毕。来分析一个的例子:int * (* (*fp) (int) ) [10]; 
阅读步骤:
1.从未定义的变量名开始阅读 --------------------------------------------fp
2.往右看,什么也没有,遇到了),因此往左看,遇到一个* ------一个指向某对象的指针
3.跳出括号,遇到了(int) -----------------------------------一个带一个int参数的函数
4.向左看,发现一个* ---------------------------------------(函数)返回一个指向某对象的指针
5.跳出括号,向右看,遇到[10] ------------------------------一个10元素的数组
6.向左看,发现一个* ---------------------------------------一个指向某对象指针
7.向左看,发现int -----------------------------------------int类型
所以fp是指向函数的指针,该函数返回一个指向数组的指针,此数组有10个int*型的元素。
int(*a)[],便是a指针,指向数组——数组指针
int *a[],便是数组a,此数组内有int*型元素——指针数组