谭浩强 c语言 第八章_指针

上传人:woxinch****an2018 文档编号:56912496 上传时间:2018-10-17 格式:PPT 页数:113 大小:691KB
返回 下载 相关 举报
谭浩强 c语言 第八章_指针_第1页
第1页 / 共113页
谭浩强 c语言 第八章_指针_第2页
第2页 / 共113页
谭浩强 c语言 第八章_指针_第3页
第3页 / 共113页
谭浩强 c语言 第八章_指针_第4页
第4页 / 共113页
谭浩强 c语言 第八章_指针_第5页
第5页 / 共113页
点击查看更多>>
资源描述

《谭浩强 c语言 第八章_指针》由会员分享,可在线阅读,更多相关《谭浩强 c语言 第八章_指针(113页珍藏版)》请在金锄头文库上搜索。

1、第八章,指针,主要内容,8.1地址和指针的概念8.变量的指针和指向变量的 指针变量8.数组与指针 8.字符串与指针8.指向函数的指针8.返回指针值的函数8.指针数组和指向指针的指针8.8有关指针的数据类型和指针运算的小结,8.1地址和指针的概念,内存区的每一个字节有一个编号,这就是“地址” 。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。,.按变量地址存取变量值的方式称为“直接访问”方式(,);(,);,2. 另一种存取变量值的方式称为“间接访问”的方式。即,将变量的地址存放在另一个变量中。,在语言中,指针是一种特殊的变量,它是存放地址的。,一个变量的地址称为

2、该变量的“指针”。 例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。,指针和指针变量的定义:,8.2 变量的指针和指向变量的指针变量,8.1 定义一个指针变量,定义指针变量的一般形式为 基类型 *指针变量名;,*表示指向的对象。,下面都是合法的定义: float *pointer_; char *pointer_; 可以用赋值语句使一个指针变量得到另一个变 量的地址,从而使它指向一个该变量。 例如: pointer_; pointer_;,在定义指针变量时要注意两点:,8.2.2 指针变量的引用

3、,注意:指针变量中只能存放地址(指针), 不要将一个整数(或任何其他非地址类型的数据) 赋给一个指针变量。,例8. 通过指针变量访问整型变量,#include void main ( ) int ,;int*pointer_, *pointer_;pointer_; /*把变量的地址赋给 pointer_1 */,pointer_; /*把变量的地址赋给pointer_ */ printf(%,%,); printf(%,%,*pointer_, *pointer_);,对“”和“*”运算符说明: 如果已执行了语句 pointer_; (1)* pointer_的含义是什么?“”和“*”两个运

4、算符的优先级别相同,但按自右而左方向结合。因此,* pointer_与相同,即变量a的地址。如果有pointer_2 * pointer_ ;它的作用是将(的地址)赋给pointer_2 ,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。,(2) *的含义是什么?先进行运算,得的地址,再进行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。,(3) (*pointer_)相当于。,例8 . 2 输入和两个整数,按先大后小的顺序输出和。,#include void main() int *1,*2,*,;scanf(,);1;if();print

5、f(=,=,);printf(max=,min=,*1,*2); ,运行情况如下: , , , 当输入,时,由于,将和交换。交换前的情况见图(),交换后见图()。,8.3 指针变量作为函数参数,例8 . 3 对输入的两个整数按大小顺序输出,#include void main() void swap(int *,int *);int ,;int *pointer_,*pointer_;scanf(,);pointer_ ; pointer_2 ;if( swap( pointer_ , pointer_2 );printf(,);,void swap(int *,int *) int temp

6、;temp*1;*;*temp;,例8. 输入、 3个整数,按大小顺序输出。,#include void main() void exchange(int *1, int *2, int *3);int ,*,*,*;scanf(%,%,%,&, &, &);exchange (,);printf(,);,void exchange(int *, int *, int *) void swap(int *, int *);if(*) swap(,);if(*) swap(,);if(* swap(,); void swap(int *, int *)int temp;temp*;*;*temp

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

8、组元素的地址。 在C语言中,数组名代表数组中首元素的地址,即序号为0元素的地址。因此,下面两个语句等价。 p=,8.通过指针引用数组元素,可以对数组进行运算,但只能在一定条件下才允许对指针进行加和减的运算。 1.如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。 2.如果p原来指向a0,执行+p后p的值改变了,在p的原值基础上加上一个元素所占的字节数,这样p就指向数组的下一个元素a1。 3.如果p的初值为&a0,则p+i和a+i就是数组元素ai的地址。,8.通过指针引用数组元素,*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即ai 如果指针变量p1和p2都

9、指向同一数组,如执行p2-p1,结果是两个地址之差除以数组元素的长度。假设p2-p1的结果是(2020-2012)/4=2,即表示p2所指的元素与p1所指的元素之间差2个元素。,8.通过指针引用数组元素,引用一个数组元素,可以用:() 下标法,如形式;() 指针法,如*()或*()。其中是数组名,是指向数组元素的指针变量,其初值。,例8.5 输出数组中的全部元素。,假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:,(1)下标法。 #include void main() int ;int ;for(;)scanf(,);printf();for(;)printf(,);,(2) 通

10、过数组名计算数组元素地址,找出元素的值。 #include void main() int ;int ;for(; )scanf(,);printf();for(;)printf(,*();,(3) 用指针变量指向数组元素。 #include void main() int ;int *,;for(;)scanf(,);printf();for(;();)printf( ,*);,请问下面程序是否正确。 #include void main() int ;int *,;for(;)scanf(,);printf();for(;a(p);a)printf( ,*a);,注意:数组名代表首元素地址

11、,是一个指针常量,其值在程序运行期间是固定不变的。,例8. 通过指针变量输出数组的个元素。,#include void main() int*,;for(; )scanf(,);printf();for(;, )printf(,*); ,程序运行情况: 1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483 显然输出的数值并不是数组中各元素的值,#include void main() int*,;for(;)scanf(,);printg();p=a;for(;, )printf(,*); ,8.3 用数组名作函

12、数参数,在第7章7.7节中介绍过可以用数组名作函数的参数 如: void main()i(int arr,int ); int array;(array,); void (int arr ,int ) ,例8. 将数组中个整数按相反顺序存放。,#include void main() void inv(int ,int );int ,;printf(The original array:);for(;)printf (,);printf();inv (,);printf(The array has been in verted:);for(;)printf (,);printf (); ,vo

13、id inv(int ,int ) /*形参x是数组名*/ int temp,();for(;);temp;temp;return;,运行情况如下: The original array: , The array has been inverted: ,,#include void main() void inv(int *,int );int ,;printf( The original array: );for(;)printf (,);printf ();inv(,);printf ( The array has been in verted: );for(;)printf (,);printf ();,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 高中教育

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