null第9章 指针第9章 指针哈尔滨工业大学
计算机科学与技术学院本章学习
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
本章学习内容 指针数据类型
指针变量的定义和初始化
取地址运算符,间接寻址运算符
按值调用与按地址调用,指针变量作函数
参数
函数指针 例7.9未能解决的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
:两数互换
void Swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}int main()
{
int a, b;
a = 5;
b = 9;
Swap(a, b);
printf("a=%d,b=%d",a,b);
return 0;
}程序 1:简单变量作函数参数例7.9未能解决的问题:两数互换指针为函数提供修改变量值的手段 9.1变量的内存地址9.1变量的内存地址int a=0;0x0037b000a某存储区域 9.1变量的内存地址 9.1变量的内存地址0x0037b000某存储区域0x0037b0010x0037b0020x0037b003&aint a=0;a 9.1变量的内存地址 9.1变量的内存地址0x0037b000某存储区域0x0037b0010x0037b0020x0037b003&aint a=0;a 9.1变量的内存地址 9.1变量的内存地址【例9.1】使用取地址运算符&取出变量的地址,然后将其显示在屏幕上。 9.1变量的内存地址 9.1变量的内存地址0x0037b000某存储区域0x0037b0010x0037b0020x0037b003&aaint a=0; 9.1变量的内存地址 9.1变量的内存地址0x0037b000某存储区域0x0037b0010x0037b0020x0037b003间接寻址:通过存放变量地址的变量去访问变量&aaint a=0;nullint i; scanf("%d", i); /* 这样会如何?*/
char c; scanf("%d", &c); /* 这样呢?*/i的值被当作地址。如i==100,则输入的整数就会从地址100开始写入内存输入以int的二进制形式写到c所在的内存空间。
c所占内存不足以放下一个int,其后的空间也被覆盖
9.2指针变量的定义和初始化9.2指针变量的定义和初始化存放变量的地址需要一种特殊类型的变量
指针(Pointer)类型
指针变量——具有指针类型的变量
变量的指针←→变量的地址 9.2指针变量的定义和初始化 9.2指针变量的定义和初始化【例9.2】使用指针变量在屏幕上显示变量的地址值如果指针指向一个非你控制的内存空间
并对该空间进行访问,将可能造成危险 9.2指针变量的定义和初始化 9.2指针变量的定义和初始化【例9.2】使用指针变量在屏幕上显示变量的地址值 9.2指针变量的定义和初始化 9.2指针变量的定义和初始化【例9.2】使用指针变量在屏幕上显示变量的地址值 9.2指针变量的定义和初始化 9.2指针变量的定义和初始化【例9.2】使用指针变量在屏幕上显示变量的地址值 9.2指针变量的定义和初始化 9.2指针变量的定义和初始化【例9.2】使用指针变量在屏幕上显示变量的地址值 9.2指针变量的定义和初始化 9.2指针变量的定义和初始化【例9.2】使用指针变量在屏幕上显示变量的地址值 9.3 间接寻址运算符 9.3 间接寻址运算符【例9.3】使用指针变量,通过间接寻址输出变量的值 9.3 间接寻址运算符 9.3 间接寻址运算符【例9.3】使用指针变量,通过间接寻址输出变量的值99.4 按值调用与按地址调用普通变量作函数参数—按值调用(Call by Value)
Can not modify the argument
形参(parameter)← 实参变量(variable)
指针作函数参数—按地址调用(Call by Reference )
In order to modify the argument,use:
指针形参(pointer parameter) ← &(variable)9.4 按值调用与按地址调用 9.4 按值调用与按地址调用 9.4 按值调用与按地址调用【例9.4】演示按值调用 9.4 按值调用与按地址调用 9.4 按值调用与按地址调用【例9.5】演示按地址调用 9.4 按值调用与按地址调用 9.4 按值调用与按地址调用【例9.4】演示按值调用【例9.5】演示按地址调用 9.4 按值调用与按地址调用 9.4 按值调用与按地址调用【例9.4】演示按值调用null
void Swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a, b;
a = 5;
b = 9;
Swap( &a, &b );
printf("a=%d,b=%d",a,b);
return 0;
}
void Swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}int main()
{
int a, b;
a = 5;
b = 9;
Swap(a, b);
printf("a=%d,b=%d",a,b);
return 0;
}程序 1程序 2 实 参形 参结果有何不同?Trace the execution例9.6:编写函数实现两数的互换nullint main()
{
int a, b;
a = 5;
b = 9;
Swap(a, b);
printf("a=%d,b=%d",a,b);
return 0;
}void Swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}55ab实 参形 参99xy55temp9x 和 y是内部变量
单向值传递例9.6:编写函数实现两数的互换主调函数被调函数nullint main()
{
int a, b;
a = 5;
b = 9;
Swap( &a, &b );
printf("a=%d,b=%d",a,b);
return 0;
}void Swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}&a&a实 参形 参&b&bxy5temp5ab995*x*y交换的是x 和 y
指向的单元内容主调函数被调函数例9.6:编写函数实现两数的互换nullvoid Swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}指针pTemp未初始化
指针pTemp指向哪里未知
对未知单元写操作是危险的void Swap(int *x, int *y)
{
int *pTemp;
*pTemp = *x;
*x = *y;
*y = *pTemp;
} 永远要清楚:
每个指针指向了哪里
指针指向的内容是什么 nullvoid Swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}指针pTemp被赋了值
但交换的是地址值
不是指针指向单元的内容void Swap(int *x, int *y)
{
int *pTemp;
pTemp = x;
x = y;
y = pTemp;
} 9.5用指针变量作函数参数的程序实例 9.5用指针变量作函数参数的程序实例 【例9.7】计算并输出最高分及相应学生的学号9.5用指针变量作函数参数的程序实例 【例9.7】计算并输出最高分及相应学生的学号9.5用指针变量作函数参数的程序实例 9.5用指针变量作函数参数的程序实例 9.5用指针变量作函数参数的程序实例 【例9.7】计算并输出最高分及相应学生的学号9.5用指针变量作函数参数的程序实例 9.5用指针变量作函数参数的程序实例 【例9.7】计算并输出最高分及相应学生的学号9.5用指针变量作函数参数的程序实例 9.5用指针变量作函数参数的程序实例 【例9.7】计算并输出最高分及相应学生的学号9.6函数指针及其应用 9.6函数指针及其应用 函数指针(Function Pointers)就是指向函数的指针(Pointer to a Function)
指向函数的指针变量存储的是函数在内存中的入口地址
编译器将不带()的函数名解释为该函数的入口地址
数据类型 (* 指针名)();
例如:int (*p)();
常见错误:
忘记了前一个(),写成
int *p(); /*声明一个函数名为p、返回值是整型指针的函数*/
忘掉了后一个(),写成
int (*p); /*定义了一个整型指针*/
定义时后一个括号内的参数类型与指向的函数参数类型不匹配null应用
编写通用性更强的函数
典型实例1
计算函数的定积分
典型实例2
既能按照升序排序,又能按照降序排序9.6函数指针及其应用 null【例9.8】修改例8.8中的排序函数,使其既能实现对学生成绩的升序排序,又能实现对学生成绩的降序排序
先不使用函数指针编程 9.6函数指针及其应用 null9.6函数指针及其应用 null9.6函数指针及其应用 nullnull【例9.9】修改例9.8中的程序实例,用函数指针编程实现一个通用的排序函数,对学生成绩既能实现升序排序,又能实现降序排序
使用函数指针编程 9.6函数指针及其应用 null9.6函数指针及其应用 null9.6函数指针及其应用 nullvoid SelectionSort(int a[], int n,
int (*compare)(int a, int b))
{
……
if ((*compare)(a[j], a[k]))
……
}
/*决定数据是否按升序排序,a
b为真,则按降序排序*/
int Descending(int a, int b)
{
return a > b;
} 9.6函数指针及其应用 指针变量与其他类型变量的对比指针变量与其他类型变量的对比共性
在内存中占据一定大小的存储单元
先定义,后使用
特殊性
它的内容只能是地址
必须初始化后才能使用,否则指向不确定的存储单元
只能指向同一基类型的变量
可参与的运算:加、减整数,自增、自减、关系、赋值
使用原则
明确指针指向了哪里
明确指针指向单元的内容是什么
永远不要使用未初始化的指针变量nullQuestions and answers