指针和数组
来源:互联网 发布:javascript的设计模式 编辑:程序博客网 时间:2024/06/06 01:31
首先明确一点,指针之间的加减不是简单的加减,而是只的是指针所指向元素个数的加减,也就是说是元素个数的偏移
int *p11 = (int *)0xfff4;
int *p12 = (int *)0xfff0;
cout<<p11-p12<<endl;
输出应该是4/4 =1
1. 一维数组
int a[5];
cout<<sizeof(a)<<" "<<sizeof(&a)<<" "<<sizeof(&a[0])<<endl;
//output:20 4 4
//a是一个数组,所以a的长度5*sizeof(int);&a表示数组的指针,指针的长度都是4
cout<<a<<" "<<&a<<" "<<&a[0]<<endl;
//output:0027FBAC 0027FBAC 0027FBAC
//数组和指针不同之处在于,编译器并没有为数组a分配一个空间存储其地址,所以a就表示这个数组的地址;&a表示是数组的指针,而这个数组是5个元素的数组,&a表示一个指向五元数组的指针
cout<<a+1<<" "<<&a +1 <<" "<<&a[0]+1<<endl;
//output:0027FBB0 0027FBC0 0027FBB0
//a在数值上是数组的首地址,a+1就是第二个元素的地址,0027FBAC+4 = 0027FBB0 ;a不是int *p,但是为了帮助理解可以把a看做int *p,则a+1就是其所指元素的偏移1,
//&a可以看成是int (*)[5],所以&a+1,就是&a所指向元素的偏移1,而&a所指向的元素是一个5元的数组,所以&a+1 = 0x0027FBAC+5*4 =0x0027FBAC+0x14 = 0x 0027FBC0
2 .二维数组
在内存中二维数组也是一维数组的排列方式
int a[3][4]
但是编译器是这样理解的:
a是一个3个元素的数组,而元素里存的是4元数组的地址
a+1表示第二个元素,此时a+1还是指向“4元数组”的指针,*(a+1)变为指向int的指针,但是a+1和*(a+1)的值相同,譬如都是002BF7E4
所以a[1][2]的地址可以有以下几种表示方式:
out<<&a[1][2]<<" "<<&a[0][0] +1*4+2<<" "<< (*(a+1)+2)<<endl;
还有一个比较绕的程序(红色字体表示可以替代):
int calendar[12][31];
int (*month)[31];
for (month = calendar;month<calendar+12/*&calendar[12]*/;++month)
{
int *day;
for (day = *month;day<*month +31/*&(*month)[31]*/;++day)//在这里就可以深刻理解到本来month就是一个指向31个int数组的指针,month的元素就是数组,month偏移的单位也是这个数组大小,*month就是表示31个int的数组,此时*month表示指向int 的指针
{
*day = 0;
}
}
- 指针和指针数组
- 指针数组和数组指针
- 指针数组和数组指针
- 指针数组和数组指针
- 指针数组和数组指针
- 数组指针和指针数组
- 指针数组和数组指针
- 数组指针和指针数组
- 指针数组和数组指针
- 指针数组和数组指针
- 数组指针和指针数组
- 指针数组和数组指针
- 指针数组和数组指针
- 数组指针和指针数组
- 数组指针和指针数组
- 指针数组和数组指针
- 指针数组和数组指针
- 数组指针和指针数组
- LCD驱动调试中部分常见问题的分析及解决办法
- 自学风雨路(代码学习,附上运行截图)《简易在线聊天系统》
- 三星辉煌藏隐忧 太依赖Android系统
- Shell中脚本变量和函数变量的作用域
- 线性表之顺序表示及实现
- 指针和数组
- Oracle认证:Linux与Windows的技术比较
- android 多点触摸实现图片缩放
- 润乾报表在J2EE上的部署——tomcat版
- linux中的inotify
- struts2配置问题急求 myeclipse9.0 在线等候
- table细线表格
- Webdrivier api 学习
- IT项目管理之启动项目(一)