第10章指针.ppt

上传人:本田雅阁 文档编号:2565536 上传时间:2019-04-09 格式:PPT 页数:37 大小:418.01KB
返回 下载 相关 举报
第10章指针.ppt_第1页
第1页 / 共37页
第10章指针.ppt_第2页
第2页 / 共37页
第10章指针.ppt_第3页
第3页 / 共37页
第10章指针.ppt_第4页
第4页 / 共37页
第10章指针.ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《第10章指针.ppt》由会员分享,可在线阅读,更多相关《第10章指针.ppt(37页珍藏版)》请在三一文库上搜索。

1、2019/4/9,1,第十章 指针(Pointer),指针的概念 指针变量和指针运算 指向数组的指针 指向字符串的指针 指向函数的指针 指针数组,2019/4/9,2,变量与地址,程序中: short int i; float k;,内存中每个字节有一个编号-地址,i,k,编译或函数调用时为其分配内存单元,变量是对程序中数据 存储空间的抽象,2019/4/9,3,10.1 地址和指针的概念,指针变量和指针。 内存单元的地址与内存单元的内容是不同的。,地址:内存的每一个字节有一个编号,指针变量:是保存内存地址的变量,是变量的基本类型之一(P37)。,指针:就是地址,2019/4/9,4,使用指针

2、可以获得紧凑、高效的代码 内存的动态分配、内存地址的直接处理 指针与数组关系密切 复杂数据结构的简洁表达,对指针的灵活应用,是C的一个重要特色,使用指针也可能使程序难懂 指针操作容易出错,2019/4/9,5,10.2 变量的指针和指向变量的指针变量,int *iPtr; iPtr是一个仅能指向整形变量的指针变量 float *fPtr; fPtr是一个仅能指向实形变量的指针变量,*i_pointer =3;,2019/4/9,6,直接访问与间接访问 直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量,例 i=3; -直接访问,3,例 *i_pointer=20; -间

3、接访问,20,2019/4/9,7,例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); ,危险!,例 main( ) int i=10,k; int *p; p= ,指针变量必须先赋值,再使用,2019/4/9,8,1. 运算符 /*将整型变量y的内存地址赋给指针变量yPtr*/,指针运算符,2. 运算符:间接访问运算符或指针运算符 返回其操作数(指针变量)所指 向对象的值,单目运算符,它的操作数只能是指针变量。 printf(“%d”, *yPtr);,输出结果:5,2019/4/9,9,eg10.1 通过指针变量访问整型变量,#includ

4、e void main() int a,b; int *pointer_1, *pointer_2; a=100;b=10; pointer_1=,100,10 100,10,2019/4/9,10,eg10.1,2019/4/9,11,eg 10.2:输入两个整数,按先大后小的顺序输出,void main() int *p1,*p2,*p,a,b; scanf(“%d%d”,5 9,a=5,b=9 max=9,min=5,2019/4/9,12,指针变量作为函数参数,void main() int a,b; int *x,*y; scanf(“%d,%d“, ,void swap(int *

5、p1,int *p2) int temp; temp=*p1;*p1=*p2;*p2=temp;,eg 10.3要求同eg 10.2,&a,a,&b,1,4,4,1,b,&a,&b,x,y,p2,p1,相当于两个函数返回值,2019/4/9,13,#include void swap(int *p1,int *p2); void exchange(int *q1,int *q2,int *q3); void main() int *p1,*p2,*p3,a,b,c; scanf(“%d,%d,%d“, ,void exchange(int *q1,int *q2,int *q3) if(*q1

6、*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3); void swap(int*p1,int*p2) int temp; temp=*p1; *p1=*p2; *p2=temp;,t-eg10.4.cpp 输入三个数,按大小顺序输出,传递地址:数据传递双向,2019/4/9,14,小结,一、函数传递参数的方式 1、传值调用: 1)调用函数将参数变量的值传递给被调用函数; 2)被调用函数通过retutn 语句将一个值返回给调用函数。,2、传地址调用: 1)调用函数将参数变量的地址传递给被调用函数; 2)被调用函数使用

7、指针运算符* 来修改变量的值。,二、传地址调用的使用方法 把地址作为参数的函数必须将函数的参数定义为指针变量。,2019/4/9,15,10.3数组与指针 一 指向数组元素的指针,例 int array10; int *p; p=,数组名是表示数组首地址的地址常量,p=array;,2019/4/9,16,二、通过指针引用数组元素,int a10; int *p=a; (1)p+1 指向下一个元素,不是p的内容加1 0200 0201 错,(2)*(p+i)和*(a+i)就是ai (p+i)代表p+i*d 是ai的地址,(3)指向数组的指针变量也可以带下标 pi与*(p+i)等价,引用数组元素

8、有各种方法 (1)下标法ai (2)指针法*(a+i)或*(p+i)其中p=a;,2019/4/9,17,数组元素表示方法, 变址运算符 ai *(a+i),ai pi *(p+i) *(a+i),eg10.5(三种方法p231),2019/4/9,18,须注意的问题,1、 自加:在循环中利用p+ 指向不同元素 数组名与指针变量的区别: 指针变量是变量; 数组名是指针常量, 不可改变。 a+,2 、初值:p=a;每一次循环开始前,应当使指针初始化 eg10_6 3 、超界:若不初始化会出现p+指向数组之外。,2019/4/9,19,eg10.6.cpp #include void main()

9、 int *p,i,a10; p=a; for(i=0;i10;i+) scanf(“%d“,p+); printf(“n“); for(i=0;i10;i+,p+) printf(“%4d“,*p);,p=a;,2019/4/9,20,指针的运算 指针变量的赋值运算 p= (指针变量p2值p1) 不能把一个整数p,也不能把p的值整型变量,如 int i, *p; p=1000; () i=p; (),2019/4/9,21,指针的算术运算: pi p id (i为整型数,d为p指向的变量所占字节数),例 p指向float数,则 p+1 p+1 4,例 p指向int型数组,且p= 则p+1 指

10、向a1,例 int a10; int *p=,例 int a10; int *p1=,2019/4/9,22,五、用数组名做函数实参(传递数组的首地址),数组名作为实参是数组首地址 数组名作为形参是指针变量 函数首部:f(int x,int n) f(int *x,int n)是等价的(p235),void main() int a10,num; f(a,num); ,2019/4/9,23,用循环处理,设两个位置变量:i , j; i的初值为0,j的初值为n-1 i=0, 1, 2 , (n-1)/2 j=n-1-i,eg10.7.c:将数组中n个整数按相反顺序存放,2019/4/9,24,

11、例 将数组a中的n个整数按相反顺序存放,实参与形参均用数组名,void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; void main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(“The array has been reverted:n“); for(i=0;i10;i+) printf(“%d,“,ai); printf(“n“); ,m=4,2019/4/9,25,例 将数组a中的n个整数按相反顺序存放,v

12、oid inv(int *x, int n) int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(“The array has been reverted:n“); for(i=0;i10;i+) printf(“%d,“,ai); printf(“n“); ,实参用数组名,形参用指针变量,2019/4/9,26,例 将数组a中的n个整数按相反顺序存放,void inv(

13、int *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(“%d“,p); p=a; inv(p,10); printf(“The array has been reverted:n“); for(p=a;pa+10;p+) printf(“%d“,*p); ,实参与形参均用指针变量,2019/4/9,27,例 将数组a中的n个整数按相反顺序存放,void inv(

14、int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(“%d“,p); p=a; inv(p,10); printf(“The array has been reverted:n“); for(p=arr;parr+10;p+) printf(“%d “,*p); ,实参用指针变量,形参用数组,2019/4/9,28,void sort(int x, int n) int i, j, k, t;

15、for (i=0; ixk) k=j; if (k!=i) t=xi,xi=xk,xk=t; ,void main() int a10, *p, i; p = a; for (i=0; i10; i+) scanf(“%d“, p+); p = a; sort(p, 10); for (p=a,i=0; i10; i+) printf(“%d“, *p);p+; ,eg10.9 选择法排序,int *x,sort(a, 10);,2019/4/9,29,10.4 字符串与指针,一、字符串的表示形式 (1)用字符数组存放一个字符串,(2)用字符指针指向一个字符串,void main() char

16、 str_1 =“Hello,World!”; printf(“%sn”, str_1);,void main() char *str_2=“Hello,World!”; printf(“%sn”,str_2);,字符指针初始化:把字符串首地址赋给str_2 char *str_2; str_2=“Hello,world!”;,2019/4/9,30,eg10.17 .c 将字符串a复制到b,#include void main() char a =“I am a boy.“,b20; int i; for(i=0;*(a+i)!=0;i+) *(b+i)=*(a+i); *(b+i)=0;

17、printf(“string a is:%sn“,a); printf(“string b is:“); for(i=0;bi!=0;i+) printf(“%c“,bi); printf(“n“);,2019/4/9,31,#include void main() char a =“I am a boy.“,b20,*p1,*p2; int i;p1=a;p2=b; for(;*p1!=0;p1+,p2+) *p2=*p1; *p2=0; printf(“string a is:%sn“,a); printf(“string b is:“); for(i=0;bi!=0;i+) printf

18、(“%c“,bi); printf(“n“);,eg.10.18,2019/4/9,32,二、字符指针做函数参数,将字符串从一个函数传到另一个函数,可以采用“地址传递”,字符指针变量和数组名: 相同:均可指向字符串的起始地址; 区别:字符指针变量可进行自加自减,而数组名不行,2019/4/9,33,例 用函数调用实现字符串复制 eg 10.19,(1)用字符数组作 参数,(2)用字符指针变量 作参数,void copy_string(char from,char to) int i=0; while(fromi!=0) toi=fromi; i+; toi=0; main() char a=“

19、I am a teacher.“; char b=“You are a student.“; printf(“string_a=%sn string_b=%sn“,a,b); copy_string(a,b); printf(“nstring_a=%snstring_b=%sn“,a,b); ,void copy_string(char *from,char *to) for(;*from!=0;from+,to+) *to=*from; *to=0; main() char from=“I am a teacher.“; char to=“You are a student.“; char

20、*a=from, *b=to; printf(“string_a=%snstring_b=%sn“,a,b); copy_string(a,b); printf(“nstring_a=%snstring_b=%sn“,a,b); ,2019/4/9,34,三 字符指针变量与字符数组的讨论 char *cp; 与 char str20; 数组str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址 char str20; str=“I love China!”; () char *cp; cp=“I love China!”; () str是地址常量;cp是地址变量 cp接受键入字符串

21、时,必须先开辟存储空间,例 char str10; scanf(“%s”,str); () 而 char *cp; scanf(“%s”, cp); (),改为: char *cp,str10; cp=str; scanf(“%s”,cp); (),2019/4/9,35,10.5 函数的指针,一个函数在被调用时被分配给一个入口地址,称为 函数的指针(函数名即为其入口地址)。,一、用函数指针变量调用函数,用一个指针变量指向该函数就可以调用它。 基类型 (*指针变量名)(函数参数列表) 如: int (*p)(int, int) (指向函数的指针) 函数只有入口地址,不能用p+1表示下一条指令。

22、 注意与 int * p(int,int );区别开,是返回指针值的函数。,2019/4/9,36,int max(int,int); void main() int a,b,c; scanf(”%d,%d”,int max(int,int); void main() int a,b,c;int (*p)(int,int);p=max; scanf(”%d,%d”,c=(*p)(a,b);,2019/4/9,37,小结 指针:内存地址 指针变量: 基本类型 存放变量的地址,实验:10 .3(必做), 10.6(选做),& * 指针变量与数组 指针变量的运算:+ - (指向数组的指针),指针变量的声明:基类型 *指针变量名(Ptr) 指针变量必须初始化: &变量名 数组名 函数名,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1