通过指针引用数组元素

C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。
引入指针变量后,就可以用两种方法来访问数组元素了。
如果p的初值为&a[0],则:

  1. p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。
  1. *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。
  2. 指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。

根据以上叙述,引用一个数组元素可以用:

  1. 下标法,即用a[i]形式访问数组元素。在前面介绍数组时都是采用这种方法。
  2. 指针法,即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,此处值p=a。
  3. 通过下标法取数组元素
  1. //通过下标法取数组元素
  2. #include <stdio.h>
  3. main(){
  4. int a[10],i;
  5. for(i=0;i<10;i++)
  6. a[i]=i;
  7. for(i=0;i<5;i++)
  8. printf("a[%d]=%d\n",i,a[i]);
  9. }

通过数组名计算元素的地址,找出元素

  1. #include <stdio.h>
  2. main(){
  3. int a[10],i;
  4. for(i=0;i<10;i++)
  5. *(a+i)=i;
  6. for(i=0;i<10;i++)
  7. printf("a[%d]=%d\n",i,*(a+i));
  8. }

通过指针变量取数组元素地址

  1. #include <stdio.h>
  2. main(){
  3. int a[10],i=0,*p=a;
  4. for(i=0;i<10;i++)
  5. *(p+i)=i;
  6. for(i=0;i<10;i++)
  7. printf("a[%d]=%d\n",i,*(p+i));
  8. }

其实程序可以这样写

  1. #include <stdio.h>
  2. main()
  3. {
  4. int a[10],i,*p=a;
  5. for(i=0;i<10;)
  6. {
  7. *p=i;
  8. printf("a[%d]=%d\n",i++,*p++);
  9. }
  10. }

注意的问题:

  1. 指针变量可以实现本身的值的改变。如p++是合法的;而a++是错误的。因为a是数组名,它是数组的首地址,是常量。

2.要注意指针变量的当前值。请看下面的程序。

  1. #include <stdio.h>
  2. main(){
  3. int *p,i,a[10];
  4. p=a;
  5. for(i=0;i<10;i++)
  6. *p++=i;
  7. for(i=0;i<10;i++)
  8. printf("a[%d]=%d\n",i,*p++);
  9. }

输出结果:

这里并没有得到我们想要结果,原因很简单,

  • for(i=0;i<10;i++)
  • *p++=i;

程序执行这两行后,当前指针的值已经超出数组边界,指向数组以后的内存值了,

系统并认为有错误,但结果与我们预期的大相径庭了.正确的程序应该这样写,加上

p=a;就好了,指针野了,把它牵回来.

  1. #include <stdio.h>
  2. main(){
  3. int *p,i,a[10];
  4. p=a;
  5. for(i=0;i<10;i++)
  6. *p++=i;
  7. p=a;           //加上这一行,拴好指针这条"狗",要不就就野了
  8. for(i=0;i<10;i++)
  9. printf("a[%d]=%d\n",i,*p++);
  10. }

从上例可以看出,虽然定义数组时指定它包含10个元素,但指针变量可以指到数组以后的内存单元,系统并不认为非法。

*p++,由于++和*同优先级,结合方向自右而左,等价于*(p++)。

*(p++)与*(++p)作用不同。若p的初值为a,则*(p++)等价a[0],*(++p)等价a[1]。

(*p)++表示p所指向的元素值加1。

如果p当前指向a数组中的第i个元素,则

*(p--)相当于a[i--];
*(++p)相当于a[++i];
*(--p)相当于a[--i]。

转载于:https://blog.51cto.com/qtlinux/1186179

C语言简明教程--指针5相关推荐

  1. [C语言简明教程] 指针的进阶(上)

    文章目录 前言 一.指针是什么? 二.指针的进阶 1. 字符指针 2.指针数组 3.数组指针 3.1数组指针定义 3.2 &数组名 和 数组名 3.3 数组指针的使用 4. 数组参数.指针参数 ...

  2. [C语言简明教程] 指针的进阶(下)

    文章目录 前言 一.函数指针 二.函数指针数组 三.回调函数 总结 前言 C语言中指针的重要性是:通过指针不仅可以对数据本身,还可以对存储数据的变量地址进行操作.指针能够帮助我们快速地传递数据,减少内 ...

  3. C语言简明教程,C语言简明教程

    C语言是一种结构化的计算机程序设计语言,具有使用灵活.表达能力强,兼具高级语言和低级语言双重功能等特点,是各大院校计算机程序设计入门课程的*语言之一.本书以应用性为中心,以培养程序设计思想和程序设计能 ...

  4. UML精粹--标准对象建模语言简明教程

    今天借了一本<UML精粹--标准对象建模语言简明教程>(Uml Distilled: A Brief Guide to the Standard Object Modeling Langu ...

  5. c语言指针地址交换程序,C语言-基础教程-指针的地址分配

    我们可以定义指针变量指向任何类型的变量.在上述的处理过程中,指针变量指向的变量通过传递变量的地址来实现.指针变量的取值是内存的地址,这个地址应当是安全的,不可以是随意的,否则,写入内存单元的值将会使得 ...

  6. c语言程序链接过程,C语言简明教程(二):C程序编译链接过程和实例对照详解...

    不像高级编程语言,在C语言开发中,了解其编译链接过程显得相对重要,因为C语言是较为底层的语言,很多时候我们调试C程序或者解决其它问题都可能会涉及到C编译链接的相关知识,例如编译动态库或者静态库.下面我 ...

  7. python wasm_Go WebAssembly (Wasm) 简明教程

    Go WebAssembly (Wasm) 简明教程 1 WebAssembly 简介WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二 ...

  8. C语言入门之指针用法教程

    C语言入门之指针用法教程 这篇文章主要介绍了C语言入门之指针用法教程,主要对C语言中指针的本质及常见用法做了较为通俗易懂的分析,是后续深入学习C语言的基础,需要的朋友可以参考下 undefined u ...

  9. C语言 const 修饰指针 - C语言零基础入门教程

    目录 一.const 简介 二.const 修饰指针 1.const int *p 2.int const *p 3.int * const p 4.const int * const p 三.猜你喜 ...

  10. GCC编译器简明教程(Linux下C语言开发环境的搭建)

    GCC编译器简明教程(Linux下C语言开发环境的搭建) 市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境(例如GNOME.KDE.Unity等)和各种常用的必 ...

最新文章

  1. SimpleDateFormat线程不安全
  2. [译] Robinhood 为什么使用 Airflow
  3. java 柱状图下载_(JFreeChart)Java图表制作
  4. python装饰器类-Python装饰器15-开始使用类作为装饰器
  5. 机器学习算法学习---处理分类问题常用算法(一)
  6. python2和python3的print语句语法有什么不同_Python3.2的版本,输入print语句总是出错,是什么原因?...
  7. cusparseScsrsv_analysis函数导致内存暴涨问题
  8. BSD:Berkeley Software Distribution,伯克利软件套件
  9. 47. 全排列 II
  10. [SDOI 2011]黑白棋
  11. 【现代编译器】语法分析——正则表达式,上下文无关文法,递归下降分析,分析树...
  12. vscode编写php好用吗,vscode可以编写php吗
  13. Hyper-V虚拟机安装win10系统 2021-10-16
  14. java指定路径不存在_Java在指定路径上创建文件提示不存在解决方法
  15. 数据库实验7---数据库的备份与恢复
  16. X的学习日记LinuxOS篇
  17. 小知识系列(3):Hanoi塔(汉诺塔,河内塔)
  18. 巨强大的免费LOGO在线制作工具
  19. MySQL5.7找到data文件夹
  20. linux驱动 — 字符设备驱动模板

热门文章

  1. 【C++】判断指定元素是否在vector中的若干种方法小结
  2. 神经网络工具箱——nn.funtional、初始化策略
  3. dataframe先分组再画图
  4. 初步了解Java内部类
  5. ArcMAP 用不同颜色区分地类
  6. 自己闲着没事整理的人工智能的思维导图
  7. esayexcel导出动态表头数据
  8. matlab三次样条拟合,【MATLAB编程】三次样条
  9. mysql systemctl开机启动_Linux 开机启动项命令:chkconfig 和 systemctl
  10. diffpatch升级_Tinker资源补丁原理解析