数组和指针
2016-02-26 12:34
302 查看
可用指针变量来访问数组中任一元素,通常将数组的首地址称为数组的指针。
使用指向数组的指针变量来处理数组中的元素,不仅可使程序紧凑,而且还可提高程序的运算速率。
对一维数组a[ ]而言,当p=a后,有如下等同关系成立:
① p+i=a+i=&a[i],即p+i、a+i 均表示第i个元素的地址&a[i]。
② *(p+i) =*(a+i)=p[i]= a[i]。即*(p+i), *(a+i), p[i]均表示第i个元素值a[i],其中p[i] 的运行效率最高。
由上所述可知:一维数组的第i个元素可用四种方式引用,即: a[i]、*(p+i) 、*(a+i)、p[i]。
对于二维数组:
*(a+i) 可以表示第 i行的首地址。因此二维数组第i行首地址有三种表示方法:a[i] 、*(a+i)、&a[i][0]。
由此可推知:第i行第j列元素a[i][j]的地址有四种表示方法:a[i]+j 、*(a+i)+j、&a[i][0]+j、&a[i][j]
而第i行第j列元素a[i][j]值也有四种表示方法:*(a[i]+j) 、 *(*(a+i)+j)、*(&a[i][0]+j)、a[i][j]
输出二维数组的元素和地址
1)举例1
输出结果:
![](http://img.blog.csdn.net/20160226123203523?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以看出二维数组的每个元素的地址是连续的,按照行进行排列。且*数组名还是一个地址,数组名是一个双重指针。
2)举例2
输出结果如下:
![](http://img.blog.csdn.net/20160226124256405?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3)举例3
输出结果:
使用指向数组的指针变量来处理数组中的元素,不仅可使程序紧凑,而且还可提高程序的运算速率。
对一维数组a[ ]而言,当p=a后,有如下等同关系成立:
① p+i=a+i=&a[i],即p+i、a+i 均表示第i个元素的地址&a[i]。
② *(p+i) =*(a+i)=p[i]= a[i]。即*(p+i), *(a+i), p[i]均表示第i个元素值a[i],其中p[i] 的运行效率最高。
由上所述可知:一维数组的第i个元素可用四种方式引用,即: a[i]、*(p+i) 、*(a+i)、p[i]。
对于二维数组:
*(a+i) 可以表示第 i行的首地址。因此二维数组第i行首地址有三种表示方法:a[i] 、*(a+i)、&a[i][0]。
由此可推知:第i行第j列元素a[i][j]的地址有四种表示方法:a[i]+j 、*(a+i)+j、&a[i][0]+j、&a[i][j]
而第i行第j列元素a[i][j]值也有四种表示方法:*(a[i]+j) 、 *(*(a+i)+j)、*(&a[i][0]+j)、a[i][j]
输出二维数组的元素和地址
1)举例1
#include "stdafx.h" #include <stdio.h> #include <iostream> using namespace std; int main() { int num[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; int i,j; printf("[0x%x]:num=0x%x\n\n",num,*num); for(i=0;i<3;i++) { printf("[0x%x]:num[%d] = %d\n",num[i],i,*num[i]); for(j=0;j<4;j++) { printf("[0x%x]:num[%d][%d]=%d\n",&num[i][j],i,j,num[i][j]); } printf("\n"); } system("pause"); return 0; }
输出结果:
可以看出二维数组的每个元素的地址是连续的,按照行进行排列。且*数组名还是一个地址,数组名是一个双重指针。
2)举例2
#include "stdafx.h" #include <stdio.h> #include <iostream> using namespace std; int main() { int num[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; int i,j; printf("[0x%x]:num[0][0]=%d\n\n",num,**num); int element; for(i=0;i<3;i++) { for(j=0;j<4;j++) { element =(int)(*(num+i)+j); printf("0x%x\t",element); } printf("\n"); } system("pause"); return 0; }
输出结果如下:
3)举例3
#include "stdafx.h" #include <stdio.h> #include <iostream> using namespace std; int main() { int num[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; int i,j; printf("[0x%x]:num[0][0]=%d\n\n",num,**num); int *addr; int element; for(i=0;i<3;i++) { for(j=0;j<4;j++) { addr = (*(num+i)+j); element = *(*(num+i)+j); printf("[0x%x]:num[%d][%d] = %d\n",addr,i,j,element); } printf("\n"); } system("pause"); return 0; }
输出结果:
相关文章推荐
- GDKOI2016总结
- 最大权闭合子图
- 第九十六题(编写strcpy 函数)
- MongoDB 博客截图之二
- 不错的网站及博客地址
- 破解ios的环境和软件
- GridView中使用 jQuery DatePicker (UpdatePanel)
- 文件操作概念
- python监听windows上w3wp进程,如果cpu>=95%则自动kill掉
- vb.net利用webbrowser下载(加载完成判断、多线程、委托)
- 【Linux C中文函数手册】之 目录操作函数
- 4.1 MySQL程序概述
- file 图片的剪切
- 鸟哥的Linux私房菜(服务器)- 第十八章、网络驱动器装置: iSCSI 服务器
- Mybatis Generator 配置文件详解
- iOS App 的逆向工程: Hacking on Lyft
- Android之混淆心得与亲身体验
- sizeof既是关键字,又是运算符(操作符),但不是函数!
- uva 10382 Watering Grass
- memcached/Redis 区别