C语言简明教程--指针5
通过指针引用数组元素
C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。
引入指针变量后,就可以用两种方法来访问数组元素了。
如果p的初值为&a[0],则:
- p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。
- *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。
- 指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
根据以上叙述,引用一个数组元素可以用:
- 下标法,即用a[i]形式访问数组元素。在前面介绍数组时都是采用这种方法。
- 指针法,即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,此处值p=a。
- 通过下标法取数组元素
- //通过下标法取数组元素
- #include <stdio.h>
- main(){
- int a[10],i;
- for(i=0;i<10;i++)
- a[i]=i;
- for(i=0;i<5;i++)
- printf("a[%d]=%d\n",i,a[i]);
- }
通过数组名计算元素的地址,找出元素
- #include <stdio.h>
- main(){
- int a[10],i;
- for(i=0;i<10;i++)
- *(a+i)=i;
- for(i=0;i<10;i++)
- printf("a[%d]=%d\n",i,*(a+i));
- }
通过指针变量取数组元素地址
- #include <stdio.h>
- main(){
- int a[10],i=0,*p=a;
- for(i=0;i<10;i++)
- *(p+i)=i;
- for(i=0;i<10;i++)
- printf("a[%d]=%d\n",i,*(p+i));
- }
其实程序可以这样写
- #include <stdio.h>
- main()
- {
- int a[10],i,*p=a;
- for(i=0;i<10;)
- {
- *p=i;
- printf("a[%d]=%d\n",i++,*p++);
- }
- }
注意的问题:
- 指针变量可以实现本身的值的改变。如p++是合法的;而a++是错误的。因为a是数组名,它是数组的首地址,是常量。
2.要注意指针变量的当前值。请看下面的程序。
- #include <stdio.h>
- main(){
- int *p,i,a[10];
- p=a;
- for(i=0;i<10;i++)
- *p++=i;
- for(i=0;i<10;i++)
- printf("a[%d]=%d\n",i,*p++);
- }
输出结果:
这里并没有得到我们想要结果,原因很简单,
- for(i=0;i<10;i++)
- *p++=i;
程序执行这两行后,当前指针的值已经超出数组边界,指向数组以后的内存值了,
系统并认为有错误,但结果与我们预期的大相径庭了.正确的程序应该这样写,加上
p=a;就好了,指针野了,把它牵回来.
- #include <stdio.h>
- main(){
- int *p,i,a[10];
- p=a;
- for(i=0;i<10;i++)
- *p++=i;
- p=a; //加上这一行,拴好指针这条"狗",要不就就野了
- for(i=0;i<10;i++)
- printf("a[%d]=%d\n",i,*p++);
- }
从上例可以看出,虽然定义数组时指定它包含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相关推荐
- [C语言简明教程] 指针的进阶(上)
文章目录 前言 一.指针是什么? 二.指针的进阶 1. 字符指针 2.指针数组 3.数组指针 3.1数组指针定义 3.2 &数组名 和 数组名 3.3 数组指针的使用 4. 数组参数.指针参数 ...
- [C语言简明教程] 指针的进阶(下)
文章目录 前言 一.函数指针 二.函数指针数组 三.回调函数 总结 前言 C语言中指针的重要性是:通过指针不仅可以对数据本身,还可以对存储数据的变量地址进行操作.指针能够帮助我们快速地传递数据,减少内 ...
- C语言简明教程,C语言简明教程
C语言是一种结构化的计算机程序设计语言,具有使用灵活.表达能力强,兼具高级语言和低级语言双重功能等特点,是各大院校计算机程序设计入门课程的*语言之一.本书以应用性为中心,以培养程序设计思想和程序设计能 ...
- UML精粹--标准对象建模语言简明教程
今天借了一本<UML精粹--标准对象建模语言简明教程>(Uml Distilled: A Brief Guide to the Standard Object Modeling Langu ...
- c语言指针地址交换程序,C语言-基础教程-指针的地址分配
我们可以定义指针变量指向任何类型的变量.在上述的处理过程中,指针变量指向的变量通过传递变量的地址来实现.指针变量的取值是内存的地址,这个地址应当是安全的,不可以是随意的,否则,写入内存单元的值将会使得 ...
- c语言程序链接过程,C语言简明教程(二):C程序编译链接过程和实例对照详解...
不像高级编程语言,在C语言开发中,了解其编译链接过程显得相对重要,因为C语言是较为底层的语言,很多时候我们调试C程序或者解决其它问题都可能会涉及到C编译链接的相关知识,例如编译动态库或者静态库.下面我 ...
- python wasm_Go WebAssembly (Wasm) 简明教程
Go WebAssembly (Wasm) 简明教程 1 WebAssembly 简介WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二 ...
- C语言入门之指针用法教程
C语言入门之指针用法教程 这篇文章主要介绍了C语言入门之指针用法教程,主要对C语言中指针的本质及常见用法做了较为通俗易懂的分析,是后续深入学习C语言的基础,需要的朋友可以参考下 undefined u ...
- C语言 const 修饰指针 - C语言零基础入门教程
目录 一.const 简介 二.const 修饰指针 1.const int *p 2.int const *p 3.int * const p 4.const int * const p 三.猜你喜 ...
- GCC编译器简明教程(Linux下C语言开发环境的搭建)
GCC编译器简明教程(Linux下C语言开发环境的搭建) 市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境(例如GNOME.KDE.Unity等)和各种常用的必 ...
最新文章
- SimpleDateFormat线程不安全
- [译] Robinhood 为什么使用 Airflow
- java 柱状图下载_(JFreeChart)Java图表制作
- python装饰器类-Python装饰器15-开始使用类作为装饰器
- 机器学习算法学习---处理分类问题常用算法(一)
- python2和python3的print语句语法有什么不同_Python3.2的版本,输入print语句总是出错,是什么原因?...
- cusparseScsrsv_analysis函数导致内存暴涨问题
- BSD:Berkeley Software Distribution,伯克利软件套件
- 47. 全排列 II
- [SDOI 2011]黑白棋
- 【现代编译器】语法分析——正则表达式,上下文无关文法,递归下降分析,分析树...
- vscode编写php好用吗,vscode可以编写php吗
- Hyper-V虚拟机安装win10系统 2021-10-16
- java指定路径不存在_Java在指定路径上创建文件提示不存在解决方法
- 数据库实验7---数据库的备份与恢复
- X的学习日记LinuxOS篇
- 小知识系列(3):Hanoi塔(汉诺塔,河内塔)
- 巨强大的免费LOGO在线制作工具
- MySQL5.7找到data文件夹
- linux驱动 — 字符设备驱动模板