关于数组指针
来源:互联网 发布:淘宝充值代理赚钱吗 编辑:程序博客网 时间: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字节的数据
- 关于指针《指针&数组》
- 关于数组指针
- 关于指针数组
- 关于数组与指针
- 关于数组地址,指针
- 关于指针代替数组
- 关于数组与指针
- 关于指针和数组
- 关于指针与数组
- 关于指针和数组
- 关于指针与数组
- 关于数组和指针
- 关于指针和数组
- 关于指针数组和数组指针
- 关于数组指针和指针数组
- 关于指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
- 个人理解:关于指针数组、数组指针、函数指针、函数指针数组、函数指针数组指针
- 关于指针的指针和二维数组
- PL/SQL 语句块详细解说
- 经典文章-API Hook Revealed
- Visual Basic .NET Black Book
- MYSQL忘记密码的处理办法
- Cisco IOS Cookbook
- 关于数组指针
- BMP文件结构
- Platform builder4.2定制WinCE系统
- Linux Administrator Street Smarts: A Real World Guide to Linux Certification Skills
- Linux内存:内存管理的实质
- 扩展Logging类,让信息在前台(JTextArea)显示
- Rapid Web Applications with TurboGears: Using Python to Create Ajax-Powered Sites
- Tutorial on Threads Programming with Python
- The Book of JavaScript, 2nd Edition: A Practical Guide to Interactive Web Pages