关于数组指针

来源:互联网 发布:淘宝充值代理赚钱吗 编辑:程序博客网 时间:2024/06/10 11:09


对于数组指针和指针数组在文字概念上面一直分不大清楚,不过没关系,只要能够理解里面的实质就可以了。

下面的定义:
int *p[];//定义了一个数组。数组成员是指向int的指针,称为指针数组。
int (*p)[];//由于()的作用,p首先是个指针,他指向的是int型的数组,称为数组指针。
int *(*p)[];//p指向一个int *型的数组
int (**p)[];//p指向一个指向int型数组的指针。
有点晕了,还是搞几个例子看看。

#include<iostream>
using namespace std;

char str0[]="c/c++";
char str1[]="java";
char str2[]="python";
char str3[]="basic";
char *total_str[4]={
  str0,
  str1,
  str2,
  str3,
};//total_str为char *型数组,即每个数组成员都是char *
char (*p0)[4];//p0为指向char []的指针
char *(*p1)[4];//p1为指向char *[]的指针
char (**p2)[4];//p2是指针的指针,指向char []型指针变量的地址
char **p3;//p3是指针的指针,指向char型指针变量的地址
int (*p4)[4];//p4为指向int []的指针
char my_array0[4]="ABC";
char my_array1[][4]={
  "DEF",
  "GHI",
};
char *my_array2[][4]={
 {str0,str1,str2,str3}, 
 {str3,str2,str1,str0},
};

int my_array3[4]={
  1,2,3,4,
};
int main(){
 p0=my_array1+1;//p0指向my_array1数组的第二行,即char [4]的地址
 cout<<*p0<<endl;//*p0指向my_array1数组的第二行的首地址
 p1=my_array2+1;//p1指向my_array2数组的第二行
 cout<<**p1<<endl;
 /*
  *p1指向my_array2数组的第二行的首地址,该地址存放的是字符串数组str3的
   地址,所以再对*p1取值,即**p1为字符串数组str3的首地址
  */
 p2=&p0;//对p0取地址,p2是指针的指针
 cout<<**p2<<endl;
 p3=total_str+1;//p3指向total_str[1]的地址
 cout<<*p3<<endl;//p3也是指针的指针
 p4=(int (*)[4])my_array3;
 /*这里是最容易出错,因为my_array3是数组的首地址,但是p0是指向int [4]的地址
 所以需要进行强制转换,但事实上数组my_array3的地址就是它的首地址*/
 cout<<p4<<","<<p4+1<<endl;//p4是数组my_array3的地址
 cout<<*p4<<","<<*p4+1<<endl;//*p4是数组my_array3的首地址
 /*
  可以看到对指向数组的首地址的指针加一,就是加上了int类型所占字节数,这里是4;
  但是对一个指向数组地址的指针加一,就是加上指向的一唯数组所有咱有的字节数,这里是4*4=16个,即把它们看成了一个整体
  */
 return 0;
}

在eclipse+mingw环境下

运行结果:

GHI
basic
GHI
java
0x444060,0x444070
0x444060,0x444064

这里涉及到二维数组的一些概念,需要搞清楚,例如二维数组a[6][6];
那么a[0],a[1]...表示第一行,第二行...的首地址。
而a,a+1...表示的是第一行,第二行...的地址,即一维数组的地址,所以可以用指向数组的指针表示。
另外,*a,*(a+1)...与a[0],a[1]...相同,在这里个人感觉运算符*不能用取地址中的数据来理解,或者就把他理解为是个规定吧
所以用地址的办法表示二维数组中的某个数,可以这样*(a[1]+2)或者*(*(a+1)+2)[数组a中第二行,第二个数据]
为了使定义更加清晰,可以使用typedef关键词。
typedef char ARRAY_TYPE[];
typedef char *POINT_TPYE;

那么样以上的内容就可以变成:
POINT_TPYE p;//相当于char *p[];
ARRAY_TYPE *p;//相当于char (*p)[];
这里我们可以这么使用,如果我想定义个8字节类型的数据(int类型为4字节),可以:
typedef int ARRAY_TYPE[2];
ARRAY_TYPE  my_data;//那么my_data就是一个占8字节的数据


 

原创粉丝点击