您的位置:首页 > 其它

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

2017-08-02 16:34 330 查看

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

指针数组: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*型元素——指针数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐