第7章指针ppt课件.ppt
《第7章指针ppt课件.ppt》由会员分享,可在线阅读,更多相关《第7章指针ppt课件.ppt(67页珍藏版)》请在三一文库上搜索。
1、第7章 指 针,C语言程序设计 - 第7章 指针,2,目 录,指针概念 指针变量和指针运算 指向数组的指针 指向字符串的指针 指向函数的指针 返回指针值的函数 指针数组和指向指针的指针,C语言程序设计 - 第7章 指针,3,指针 (Pointer),指针表示变量等的存储地址 使用指针可以获得紧凑、高效的代码 使用指针也可能使程序晦涩难懂 指针的使用灵活方便 指针操作容易出错且难以调试 指针与数组关系密切,C语言程序设计 - 第7章 指针,4,指针与地址,地址 通过首地址和数据类型可以访问内存中某一数据 数据类型决定所占用存储单元数 指针 就是地址 和类型有关,C语言程序设计 - 第7章 指针,
2、5,指针变量和指针运算,变量的指针和指针变量 指针变量的定义 地址运算符和指针运算符 指针变量的引用 指针的运算,C语言程序设计 - 第7章 指针,6,变量的指针和指针变量,变量的指针 内存中存储某个变量的存储单元的首地址 指针(地址)实质上是一个整数(不是C的整型) 可以通过变量的地址来间接的访问变量 指针变量 指针(地址)是一个数据,也可以用另一个变量来存放,即指针变量 通过指针变量可以间接访问变量或内存数据,C语言程序设计 - 第7章 指针,7,指针变量的定义,一般形式 基类型 *指针变量名; 说明 “基类型”表示该指针指向的数据的类型 可以定义基类型为空类型void的指针变量 举例 i
3、nt *pi; char *pc1, c, *pc2; void *p;,C语言程序设计 - 第7章 指针,8,地址运算符 (Address Operator),地址运算符 ,C语言程序设计 - 第7章 指针,9,指针运算符 (Indirection Operator),指针运算符 * 获得指针指向的内存数据 又称“间接访问运算符” 单目运算符,自右向左结合,优先级较高 操作数为具有指针(地址)意义的值 举例 int i, *p= */,C语言程序设计 - 第7章 指针,10,指针变量的引用,指针变量也要“先赋值,后使用” 没有赋值的指针变量所存储的地址数据是不确定的,对它的引用非常危险 对指
4、针的赋值要注意类型匹配,必要时可以使用强制类型转换,但要慎重使用 *p可以用于与指针p的基类型相同类型的变量可以使用的任何场合 指针变量可以作为函数的参数,C语言程序设计 - 第7章 指针,11,指针变量引用举例 (07-01.C),int a, b, c, *pa, *pb, *pc; pa = /* c=34 */,C语言程序设计 - 第7章 指针,12,指针变量与所指变量的关系,10,20,pa,pb,a,b,int a, b; int *pa, *pb;,pa = ,*pa = 10; b = 20;,pa = pb;,pb = ,&a,&*pa,*pa,*&a,C语言程序设计 - 第
5、7章 指针,13,指针变量作为函数参数,参数传递 仍然遵循“单向值传递”的规则 这里的传递规则是指针类型参数的值的传递 作为参数的指针型实参的值不会改变 但是对指针型实参所指向的内存数据所作的操作将不会随函数的返回而恢复 用途 借助指针类型参数可以改变多个数据的值,C语言程序设计 - 第7章 指针,14,指针类型函数参数举例 (07-02.C),void swap(int *x, int *y) int t; t=*x, *x=*y, *y=t; void main() int a=1, b=4; int *pa, *pb; pa= ,&a,a,&b,pb,1,4,4,1,b,pa,&a,&b
6、,y,x,参数传递,C语言程序设计 - 第7章 指针,15,指针的运算,运算类型 算术运算:加、减、自增、自减 关系运算:所有关系运算 赋值运算:一般赋值、加赋值、减赋值 上述运算在一定约束条件下才有意义(后详) 变量说明 p,q是同类型的指针变量 n是整型变量,C语言程序设计 - 第7章 指针,16,指针的算术运算,条件:p,q是指向同一数据集合(数组)的指针 注意避免数组越界,C语言程序设计 - 第7章 指针,17,指针的关系运算,条件 p,q是指向同一数据集合(数组)的指针 运算方式 p=q、pq pq:判断p所指元素是否在q所指元素之前 其他运算的含义与上述类似 若p,q不是指向同一数
7、据集合的指针,则运算无意义,C语言程序设计 - 第7章 指针,18,指针的赋值运算,条件 p,q是指向同一数据类型的指针 n是整型数据 有意义的赋值方式 p=q p=q+n、p=q-n (要求q指向数组) p+=n、p-=n (要求p指向数组) 注意避免数组越界,C语言程序设计 - 第7章 指针,19,指针的运算说明,指针的运算还包括 指针运算 对指向数组的指针的下标运算 对指针变量的取地址运算 对指向结构体的指针的指向成员运算 除上述运算方式(包括约束条件)外的其他运算都没有意义 无意义的指针运算不一定会出现语法错误,但可能造成危险的操作,C语言程序设计 - 第7章 指针,20,指针的运算举
8、例,short a5, *p, *q; p = ,C语言程序设计 - 第7章 指针,21,指向数组的指针,指针与数组的关系 指向数组的指针 通过指针引用数组元素 数组用作函数参数 指向二维数组的指针,C语言程序设计 - 第7章 指针,22,指针与数组的关系,数组名是“常量指针” 数组名表示数组的首地址,因此数组名也是一种指针(地址) 数组名表示的地址(指针)不能被修改,所以称之为“常量指针” 数组的指针 数组的起始地址 与数组名表示的指针相同 与数组的第一个元素(a0)的地址相同,C语言程序设计 - 第7章 指针,23,数组和指针的用法,数组名不能被赋值和修改,若指针指向数组,则两者的其他用法
9、基本相同 定义指针时,只分配一段用来存放地址的空间,而没有分配存放数据的空间 定义数组时,为所有元素分配相应的连续的存储空间,但没有存放地址的空间 指针应赋值后才能使用 数组名不能被赋值,可以直接使用,C语言程序设计 - 第7章 指针,24,指向数组的指针,char a10, *p; p = ,a,p,&a0,C语言程序设计 - 第7章 指针,25,通过指针引用数组元素,当一个指针变量指向数组或某个数组元素时,可以通过这个指针变量引用所有的数组元素 引用数组元素的方法 下标运算符,例如ai、pi 指针运算符*,例如*(a+i)、*(p+i) 注意数组名不能被修改和赋值 注意防止下标越界,C语言
10、程序设计 - 第7章 指针,26,通过指针引用数组元素图示,p0, *p, *a,p, a,p+1, a+1,p1, *(p+1), *(a+1),q+i-2, p+i, a+i,pi, *(p+i), *(a+i) qi-2, *(q+i-2),p+9, a+9,p9, *(p+9), *(a+9),q, p+2, a+2,p2, *(p+2), *(a+2) q0, *q,C语言程序设计 - 第7章 指针,27,数组名和指针引用数组元素比较 (1),指针指向数组首地址 前提条件:int a10, *p=a; ai、pi、*(a+i)、*(p+i)等用法都是合法的,且它们都表示同一个数组元素
11、 a+i(或p+i)不是简单的在a(或p)表示的地址值上简单的加i,而是加上i个基类型所需的地址偏移量,即加上i*sizeof(int) 指针值可以改变,如p+为下一元素的地址 数组名的值不能修改,如a+是非法操作,C语言程序设计 - 第7章 指针,28,数组名和指针引用数组元素比较 (2),指针指向某个数组元素 前提条件:p=a+i; *(p+)与ai+等价 *(p-)与ai-等价 *(+p)与a+i等价 *(-p)与a-i等价 注意不能使用*(a+)或a=p+i这种形式 注意区分运算顺序,*(p+)与(*p)+ 注意防止下标越界,注意掌握指针位置,C语言程序设计 - 第7章 指针,29,通
12、过指针引用数组元素举例,int a10, i, *p; p = a; /* 指针需要先赋值 */ while (pa+10) /* 指针在数组范围内移动 */ scanf(“%d“, p+); /* 指针向下移动 */ p = a; /* 指针指向正确位置 */ for (i=0; i10; i+) printf(“%d“, pi); /* 指针使用 */,C语言程序设计 - 第7章 指针,30,数组用作函数参数,数组元素用作函数实参 与同类型的一般变量用法相同 数组用作函数参数 数组类型可以作为函数参数类型 数组可以用作函数的形参和实参 定义函数时,数组型形参实际上作为指针型形参处理,实参可
13、用相同类型的数组或指针 声明数组类型形参时,不需要指定数组长度 一般应把数组长度作为另一个参数传递,C语言程序设计 - 第7章 指针,31,以数组作为实参的几种方法 (1),形参用数组名 实参用数组名,形参用指针变量 实参用数组名,f(int x, int n) . . main() int a10; . . f(a, 10); ,f(int *x, int n) . . main() int a10; . . f(a, 10); ,C语言程序设计 - 第7章 指针,32,以数组作为实参的几种方法 (2),形参用数组名 实参用指针变量,形参用指针变量 实参用指针变量,f(int x, int
14、n) . . main() int a10, *p=a; . . f(p, 10); ,f(int *x, int n) . . main() int a10, *p=a; . . f(p, 10); ,C语言程序设计 - 第7章 指针,33,数组用作函数参数举例,选择排序法,C语言程序设计 - 第7章 指针,34,例1:选择排序法 (07-03.C),void sort(int x, int n) /* int *x */ int i, j, k, t; for (i=0; ixk) k=j; if (k!=i) t=xi,xi=xk,xk=t; ,C语言程序设计 - 第7章 指针,35,例
15、1:选择排序法 (续),void main() int a10, *p, i; p = a; for (i=0; i10; i+) scanf(“%d“, p+); p = a; sort(p, 10); /* sort(a, 10); */ for (p=a,i=0; i10; i+) printf(“%d“, *p+); ,C语言程序设计 - 第7章 指针,36,指向二维数组的指针 (1),char a34;,*a,*(a+1),*(a+2),a、a+1、a+2都是指针,它们的基类型是长度为4的字符数组,它们与下面定义的指针p同类型 char (*p)4;,C语言程序设计 - 第7章 指针
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 ppt 课件
链接地址:https://www.31doc.com/p-2578570.html