指针数组,数组指针,以及二维数组
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*型元素——指针数组。
相关文章推荐
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- 再谈一维数组、二维数组与指针、数组指针
- 二维指针,二维数组,以及指向数组的指针的相关问题
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- [转] 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- [转] 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- C++数组(二维数组)与指针 以及 函数传递/返回指针和数组参数
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则(转)
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- 二维数组和指针 和指针数组,数组指针
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则 .
- 彻底了解指针数组,数组指针,以及函数指针