《哈工大苏小红版_c语言_课件_chart9_pointer》由会员分享,可在线阅读,更多相关《哈工大苏小红版_c语言_课件_chart9_pointer(51页珍藏版)》请在金锄头文库上搜索。
1、第9章 指针,于水 ,2/51,本章主要内容,指针变量的定义和初始化 指针变量的使用 传值调用与传地址调用 指针变量作函数参数 函数指针 二重指针,3/51,指针变量的定义和初始化,4/51,指针变量的定义和初始化,指针的引出 内存中的地址按字 节编号,每个字节的 存储单元均对应一个 地址,char a = A; int b = 0,c = 0;,5/51,指针变量的定义和初始化,指针的引出 变量的地址 变量在内存中所占存储空间的首地址 变量的值 变量在存储空间中存放的数据内容 变量的存取 通过变量的地址访问变量的值,6/51,指针变量的定义和初始化,指针变量的定义 指针 表示变量的地址的一种
2、数据类型 指针变量就是变量的存储地址 指针变量的定义方法 类型关键字 * 指针变量名;,int *pa;,/*定义一个指向整型变量的指针*/,7/51,指针变量的定义和初始化,指针变量的初始化 将一个地址变量赋给指针变量指针变量只能指向同类型的变量,int *pa = ,int *pa ; pa = ,char *pa ; int c = 10; pa = ,编译器警告,char *pa ; int c = 10; pa = (char *),8/51,指针变量的定义和初始化,指针变量的初始化 未初始化的指针变量为随机值 野指针 可能会造成数据的误操作,引发严重后果 未确定初始值的指针变量的初
3、始化 将其初始化为NULL NULL表示空,零值(定义于stdio.h),9/51,指针变量的定义和初始化,例9.2,10/51,指针变量的定义和初始化,例9.2,11/51,指针变量的定义和初始化,例9.2,12/51,本章主要内容,指针变量的定义和初始化 指针变量的使用 传值调用与传地址调用 指针变量作函数参数 函数指针 二重指针,13/51,指针变量的使用,直接寻址和间接寻址 直接寻址 直接变量名或者变量的地址存取变量的内容的访问方式间接寻址 通过指针变量间接存取它所指向的变量的访问方式 间接运算符“*”用来得到指针变量所指向的变量的值,scanf(“%d”,printf(“%d”,a)
4、;,14/51,指针变量的使用,间接寻址运算符”*” 向指针指向的内存单元赋值读取指针指向内存单元的值并赋给其它变量,int a ; int *pa = ,int a = 3 ,b; int *pa = ,15/51,指针变量的使用,指针的使用原则 永远清楚每个指针指向了哪里,指针必须指向一块有意义的内存 永远清楚每个指针指向的对象的内容是什么 永远不要使用未经初始化的指针变量,16/51,指针与其它类型变量的对比,共性 在内存中占据一定大小的存储单元 先定义,后使用 特殊性 它的内容只能是地址 必须初始化后才能使用,否则指向不确定的存储单元 只能指向同一基类型的变量 可参与的运算:加、减整数
5、,自增、自减、关系、赋值,17/51,指针变量的使用,有关指针的运算 指针的各种运算与其所指向的基类型有关 指针的移动字节数以其基类型所占有的字节数为基本单位,int *pa; int a; pa = ,2004H,18/51,指针变量的使用,有关指针的运算,char *pa; char a = 10,20,b; pa = a; /&a0=2000H,b = *pa = ?,b = *pa+,b =(*pa)+,b = +*pa,b = *+pa,求下列表达式执行完后b,a0,a1,pa的值,b = a0 = a1 = pa =,19/51,本章主要内容,指针变量的定义和初始化 指针变量的使用
6、 传值调用与传地址调用 指针变量作函数参数 函数指针 二重指针,20/51,传值调用与传地址调用,使用函数实现交换两个数,void swap(int a,int b) int temp;temp = a;a = b;b = temp; ,#include int main() int a,b;a = 1;b = 2;printf(“initial a = %d,b = %d”,a,b);swap(a,b);printf(“now a = %d,b = %d”,a,b);return 0; ,21/51,传值调用与传地址调用,传值调用 将函数调用语句中的实参的一份副本传给函数的形参 简单的值的传
7、递,实参的值没有发生变化,22/51,传值调用与传地址调用,传地址调用 将变量的地址传递给函数的形参 形参和实参指向了同一个内存地址,对形参的操作同时影响了实参的值,形参,实参,23/51,传值调用与传地址调用,用传地址调用改写交换两数程序,void swap(int *a,int *b) int temp;temp = *a;*a = *b;*b = temp; ,#include int main() int a,b;a = 1;b = 2;printf(“initial a = %d,b = %d”,a,b);swap( ,24/51,传值调用与传地址调用,用传地址调用改写交换两数程序,
8、void swap(int *a,int *b) int temp;temp = *a;*a = *b;*b = temp; ,void swap(int *x, int *y) int *temp; *temp = *x;*x = *y;*y = *temp; ,指针temp未初始化 指针temp指向哪里未知 对未知单元写操作是危险的,25/51,传值调用与传地址调用,用传地址调用改写交换两数程序,void swap(int *a,int *b) int temp;temp = *a;*a = *b;*b = temp; ,void swap(int *x, int *y) int *tem
9、p; temp = x;x = y;y = temp; ,指针temp被赋了值 但交换的是地址值 不是指针指向单元的内容,26/51,本章主要内容,指针变量的定义和初始化 指针变量的使用 传值调用与传地址调用 指针变量作函数参数 函数指针 二重指针,27/51,指针变量做为函数参数,例9.7 从键盘输入某班学生某门课程的成绩(每班人数最多不超过40人,具体人数由键盘输入),计算并输出最高分及相应学生的学号,28/51,指针变量做为函数参数,例9.7,29/51,Not Work!Why?,指针变量做为函数参数例9.7,例9.7,30/51,指针变量做为函数参数,例9.7,31/51,指针变量做
10、为函数参数,例9.7,32/51,指针变量做为函数参数,例9.7,33/51,本章主要内容,指针变量的定义和初始化 指针变量的使用 传值调用与传地址调用 指针变量作函数参数 函数指针 二重指针,34/51,函数指针,函数的入口地址 程序也存储在内存中,与数据一样 函数的第一条指令的地址,称为函数的入口地址 编译器将不带()的函数名解释为函数的入口地址 调用函数时,实际就是转到函数的入口地址,去执行入口地址的第一条指令,35/51,函数指针,函数指针 指向函数的指针 指向了函数的第一条指令的地址,即存储的是函数的入口地址 这里可以将函数理解为一个变量,只是这个变量是一段可执行的指令 使用函数指针
11、可以编写更通用、更灵活的程序,36/51,函数指针,函数指针的定义 数据类型 (* 指针名)(参数列表);定义了一个函数指针add,它指向了一个函数,此函数返回值的数据类型为整型,并具有两个整型参数,int (*add)(int a,int b);,数据类型,指针名,参数列表,37/51,函数指针,函数指针的定义 常见错误定义了一个函数add,函数返回值为指向整型数据的指针,并具有两个整型参数定义了一个指向整型的指针,int *add(int a,int b);,int (*add);,38/51,函数指针,函数指针的使用,int add(int a,int b); int main() in
12、t (*padd)();int a,b,c;a = 1,b = 2;padd = add;c = (*padd)(a,b);printf(“c=%dn”,c); ,int add(int a,int b) return a+b; ,c = padd(a,b);,39/51,【例9.8】修改例8.8中的排序函数,使其既能实现对学生成绩的升序排序,又能实现对学生成绩的降序排序 先不使用函数指针编程,函数指针的应用,40/51,函数指针的应用,41/51,函数指针的应用,42/51,函数指针的应用,43/51,函数指针的应用,44/51,【例9.9】修改例9.8中的程序实例,用函数指针编程实现一个通
13、用的排序函数,对学生成绩既能实现升序排序,又能实现降序排序 使用函数指针编程,函数指针的应用,45/51,函数指针的应用,46/51,函数指针的应用,47/51,函数指针的应用,/*按升序排序*/ int Ascending(int a, int b) return a b; ,void SelectionSort(int a, int n, int (*compare)(int a, int b) if (*compare)(aj, ak) ,48/51,本章主要内容,指针变量的定义和初始化 指针变量的使用 传值调用与传地址调用 指针变量作函数参数 函数指针 二重指针,49/51,&p,&q,&a,?,int *q,int a,&q,&a,二重指针,指向指针的指针多级指针 指针变量指向的是另一个指针变量,int * p;,50/51,二重指针,指向指针的指针,int main() int a = 5;int *b = ,本章结束,