C语言第10章指针1章节

上传人:E**** 文档编号:91277227 上传时间:2019-06-27 格式:PPT 页数:110 大小:839KB
返回 下载 相关 举报
C语言第10章指针1章节_第1页
第1页 / 共110页
C语言第10章指针1章节_第2页
第2页 / 共110页
C语言第10章指针1章节_第3页
第3页 / 共110页
C语言第10章指针1章节_第4页
第4页 / 共110页
C语言第10章指针1章节_第5页
第5页 / 共110页
点击查看更多>>
资源描述

《C语言第10章指针1章节》由会员分享,可在线阅读,更多相关《C语言第10章指针1章节(110页珍藏版)》请在金锄头文库上搜索。

1、2019/6/27,1/110,第十章,指针,2019/6/27,2/110,10.1地址和指针的概念,为了说清楚什么是指针,必须弄清楚数据在内存中是如何存储的,又是如何读取的。,内存区的每一个字节有一个编号,这就是“地址” 。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。,、按变量地址存取变量值的方式称为“直接访问”方式,2019/6/27,3/110,2019/6/27,4/110,另一种存取变量值的方式称为“间接访问”的方式。即,将变量的地址存放在另一个变量中。,在语言中,指针是一种特殊的变量,它是存放地址的。假设我们定义了一个指针变量i_pointer

2、用来存放整型变量的地址,它被分配地址为(3010)、(3011)的两个字节。可以通过语句:i_pointer ; 将的地址(2000)存放到i_pointer中。这时, i_pointer的值就是(2000) ,即变量所占用单元的起始地址。要存取变量的值,可以采用间接方式:先找到存放“的地址”的变量i_pointer ,从中取出的地址(2000),然后到2000 、 200字节取出的值()。,2019/6/27,5/110,2019/6/27,6/110,一个变量的地址称为该变量的“指针”。 例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量

3、”。上述的i_pointer就是一个指针变量。,指针和指针变量的定义:,指针变量的值(即指针变量中存放的值)是地址(即指针)。请区分“指针”和“指针变量”这两个概念。,2019/6/27,7/110,10.2 变量的指针和指向变量的指针变量,10.1 定义一个指针变量,定义指针变量的一般形式为 基类型 *指针变量名;,2019/6/27,8/110,下面都是合法的定义: float *pointer_; / pointer_是指向float型变量的指针变量 char *pointer_; /pointer_是指向字符型变量的指针变量 可以用赋值语句使一个 指针变量得到另一个变 量的地址,从而使

4、它指 向一个该变量。如: pointer_; pointer_;,2019/6/27,9/110,在定义指针变量时要注意两点:,2019/6/27,10/110,10. 指针变量的引用,请牢记,指针变量中只能存放地址(指针), 不要将一个整数(或任何其他非地址类型的数据) 赋给一个指针变量。,例10. 通过指针变量访问整型变量,#include void main ( ) int ,; int*pointer_, *pointer_; ; pointer_; /*把变量的地址赋给 pointer_1 */,2019/6/27,11/110,pointer_; /*把变量的地址赋给 pointe

5、r_ */ printf(%,%,); printf(%,%,*pointer_, *pointer_); ,2019/6/27,12/110,对“”和“*”运算符说明: 如果已执行了语句 pointer_; (1)* pointer_的含义是什么?“”和“*”两个运算符的优先级别相同,但按自右而左方向结合,因此先进行* pointer_的运算,它就是变量,再执行运算。因此,* pointer_与相同,即变量a的地址。如果有pointer_2 * pointer_ ; 它的作用是将(的地址)赋给pointer_2 ,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。,20

6、19/6/27,13/110,2019/6/27,14/110,(2) *的含义是什么?先进行运算,得的地址,再进行*运算。即所指向的变量,也就是变量a。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。,(3) (*pointer_)相当于。注意括号是必要的,如果没有括号,就成为了*pointer_,从附录可知:+和*为同一优先级别,而结合方向为自右而左,因此它相当于*(pointer_)。由于+在pointer_1的右侧,是“后加”,因此先对pointer_的原值进行*运算,得到的值,然后使pointer_的值改变,这样pointer_不再指向了。,2019/6/27,1

7、5/110,例10 . 2 输入和两个整数,按先大后小的顺序输出 和。,#include void main() int *1,*2,*,; scanf(,); 1; if() ; printf(=,=,); printf(max=,min=,*1,*2); ,2019/6/27,16/110,运行情况如下: , , , 当输入,时,由于,将和交换。交换前的情况见图(),交换后见图()。,2019/6/27,17/110,2019/6/27,18/110,10.3 指针变量作为函数参数,例10 . 3 对输入的两个整数按大小顺序输出,#include void main() void swap

8、(int *,int *); int ,; int *pointer_,*pointer_; scanf(,); pointer_ ; pointer_2 ; if() swap( pointer_ , pointer_2 ); printf(,); ,2019/6/27,19/110,void swap(int *,int *) int temp; temp*1; *; *temp; ,2019/6/27,20/110,2019/6/27,21/110,例10. 输入、 3个整数,按大小顺序输出,#include void main() void exchange(int *1, int *

9、2, int *3); int ,*,*,*; scanf(%,%,%,&, &, &); ; exchange (,); printf(,); ,2019/6/27,22/110,void exchange(int *, int *, int *) void swap(int *, int *); if(*) swap(,); if(*) swap(,); if(*)swap(,); void swap(int *, int *) int temp; temp*; *; *temp; ,2019/6/27,23/110,10.3 数组与指针,一个变量有地址,一个数组包含若干元素,每个数组元素

10、都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。,2019/6/27,24/110,定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。例如: ; (定义为包含个整型数据的数组) *; (定义为指向整型变量的指针变量) 应当注意,如果数组为型,则指针变量的基类型亦应为型。,10.3.1 指向数组元素的指针,2019/6/27,25/110,对该指针变量赋值: ; 把元素的地址赋给指针变量。也就是使指向数组的第号元素,如图:,2019/6/27,26/1

11、10,10.通过指针引用数组元素,引用一个数组元素,可以用: () 下标法,如形式; () 指针法,如*()或*()。其中是数组名,是指向数组元素的指针变量,其初值。,例10.5 输出数组中的全部元素,假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:,2019/6/27,27/110,(1)下标法 #include void main() int ; int ; for(;) scanf(,); printf(); for(;) printf(,); ,2019/6/27,28/110,(2) 通过数组名计算数组元素地址,找出元素的值。 #include void main() i

12、nt ; int ; for(; ) scanf(,); printf(); for(;) printf(,*(); ,2019/6/27,29/110,(3) 用指针变量指向数组元素。 #include void main() int ; int *,; for(;) scanf(,); printf(); for(;();) printf( ,*); ,2019/6/27,30/110,例10. 通过指针变量输出数组的个元素。,有人编写出以下程序: #include void main() int*,; ; for(; ) scanf(,); printf(); for(;, ) prin

13、tf(,*); ,2019/6/27,31/110,这个程序乍看起来好像没有什么问题。有的人即使已被告知此程序有问题,还是找不出它有什么问题。我们先看一下运行情况: 1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483 显然输出的数值并不是数组中各元素的值,2019/6/27,32/110,解决这个问题的办法,只要在第二个循环之前加一个赋值语句: ;,#include void main() int*,; ; for(;) scanf(,); printf(); p=a; for(;, ) printf(,*); ,2019/6/27,33/110,IV10.3 用数组名作函数参数,在第8章8.7节中介绍过可以用数组名作函数的参数 如: void main() (int ,int ); int ; (,); void (int ,int ) ,2019/6/27,34/110,I f (int arr , int n) 但在编译时是将arr按指针变量处理的,相当于将函数f的首部写成 f (int *arr, int n) 以上两种写

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号