Presentation is loading. Please wait.

Presentation is loading. Please wait.

C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.

Similar presentations


Presentation on theme: "C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计."— Presentation transcript:

1 C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计

2 “ 目录 C++语言程序设计 基本知识 编程技能 刨根问底 指针与函数 指针与字符串 指针 void类型指针 指针与数组 动态内存
指针与结构体 指针 动态内存 引用 void类型指针 内存泄漏与悬挂指针 C++语言程序设计

3 编程技能 a C++语言程序设计

4 在程序设计中,指针和引用的主要应用之一是作为函数的形式参数
(一)指针与函数 在程序设计中,指针和引用的主要应用之一是作为函数的形式参数 它们形成了C++函数调用中的另一种调用方式:地址调用 地址调用可以 提高参数的传递效率 从函数“返回多个结果” C++语言程序设计

5 (一)指针与函数 用指针作为函数形式参数,实现地址调用 使用特点 函数的形式参数是指针变量 函数的实际参数是实参变量的地址
形参指针类型和实参变量的类型必须相同 使用特点 因为传递给形参的是实参变量的地址,所以形参指针指向实参变量 通过对形参指针的间接引用运算,就可以访问实参变量,包括改变实参变量的值 函数调用后,可以保留对实参变量的操作结果,如果有多个形参都是指针变量,就可以有多个实参变量在函数调用中得到修改 C++语言程序设计

6 (一)指针与函数 关于地址调用“可以返回多个结果”的理解 实际上并不存在从形参到实参的“返回”操作 形参指针的间接引用就是对实参变量的操作
实参变量的变化在函数调用过程中已经发生,而不是在函数执行后才发生 C++语言程序设计

7 (一)指针与函数 例:编写数据交换的函数 C++语言程序设计 //通过地址调用,交换调用程序的两个数据
#include<iostream> using namespace std; void Swap(int *a, int *b); void main() { int x(10), y(5); cout<<"主函数变量的值: x=" <<x<<" y="<<y<<endl; Swap(&x,&y); cout<<"返回后变量的值: x=" } void Swap(int *a, int *b) { int t; t=*a; *a=*b; *b=t; cout<<"函数中完成了交换:*a=" <<*a<<" *b="<<*b<<endl; } 实参变量的地址作为参数 指针变量作为形式参数 C++语言程序设计

8 (一)指针与函数 执行过程分析 当main()函数调用Swap()函数时,程序中用变量x和y的地址作为实参,传递给指针a和b,这样指针a和b就分别指向了实参变量x和y 当程序调用运行到Swap()内部,通过间接引用*a和*b进行交换,实际上就是x和y进行交换 C++语言程序设计

9 (一)指针与函数 用引用作为函数形式参数,实现地址调用 使用特点 C++语言程序设计 函数的形式参数是引用 函数的实际参数就是实参变量
形参引用的类型和实参变量的类型必须相同 使用特点 引用作为形式参数时,因为它就是实参变量的引用,所以在函数中并不给其分配内存空间,形参引用和实参变量对应的是同一个内存空间 引用作为形式参数时,它就是实参变量的一个别名 函数对引用的操作,就是对实参变量的操作 函数调用后,可以保留对实参变量的操作结果,如果有多个形参都是引用变量,就可以有多个实参变量在函数调用中得到修改 C++语言程序设计

10 (一)指针与函数 例:编写数据交换的函数 C++语言程序设计 //用引用作为形式参数,交换两个实际参数
#include<iostream> using namespace std; void Swap_1(int &a, int &b); void main() { int x(10), y(5); cout<<"主函数变量的值: x=" <<x<<" y="<<y<<endl; Swap_1(x, y); cout<<"返回后变量的值: x=" } void Swap_1(int &a, int &b) { int t; t=a; a=b; b=t; cout<<"函数中完成了交换:a=" <<a<<" b="<<b<<endl; } 变量作为实参数 引用变量作为形式参数 C++语言程序设计

11 (一)指针与函数 执行过程分析 当main()函数调用Swap()_1函数时,程序中用变量x和y作为实参,形参引用a是就是变量x的别名,形参引用b就是变量y的别名 当程序调用运行到Swap()_1函数内部,通过进行a和b的交换,实际上就是x和y进行交换 y x 10 5 a b C++语言程序设计

12 指针作为形式参数和引用作为形式参数的对比
(一)指针与函数 指针作为形式参数和引用作为形式参数的对比 两者都属于地址调用:通过指针的地址调用和通过引用的地址调用 两者在函数调用时都不建立实参变量的副本,都可以对实参变量本身进行操作 指针作为形式参数,调用函数时,会给形参指针变量分配内存空间,存放的是实参变量的地址,需要通过对形参指针的间接引用运算才能对实参变量操作 引用作为形式参数,它就是实参变量的一个别名,不占用独立的内存空间,对引用的操作就是对实参变量的操作 在C++的编程中,会更多地使用引用作为函数的形式参数 用引用作为形式参数,编程语句上也更简单些 C++语言程序设计

13 (一)指针与函数 常指针和常引用 常引用 不是所有以指针或引用作为形参的函数都需要修改指针所指的数据
例如:在调用一个求数组最大值的函数时,就不希望数组元素的值发生变化,所以希望在函数中能够限制对数组元素的修改 使用常指针和常引用可以实现对传递参数的保护 常引用 是指引用的是常量,也就是不能通过引用本身改变其所引用的对象 如果实参数需要保护,可以使用“常引用”作为形式参数 声明格式:const <类型名> <引用名>&; C++语言程序设计

14 (一)指针与函数 常指针 是指向常量的指针,就是规定指针所指向的内容不可以通过指针的间接引用来改变
声明格式: const <类型名> *<指针名>; 例如:const int *ptint; ptint的类型是(const int *),也就是指向一个恒定的整型数的指针 整型数本身也许是可以改变的,只是不可以通过指针ptint的间接引用来改变 而ptint也可以用不同的地址来对它赋值 常指针最常见的应用是出现在函数原型中 例如:char *strcpy(char *s1,const char *s2);//功能是把s2指向的字符串复制给s1 s2指向的字符串不要被函数修改,所以定义常指针 C++语言程序设计

15 (一)指针与函数 指针常量 指针本身的内容是常量
声明格式:<类型名> *const <指针名>=<初值>; 例如:char ch, *const ptch=&ch; 指针ptch是用ch地址初始化的常量,不可以改为其它地址 可以通过ptch的间接引用来改变ch的值 数组名就是一个指针常量 C++语言程序设计

16 (一)指针与函数 指针函数 如果一个函数的返回值是指针,则这样的函数称为指针函数 例如: int * func01(int k);
返回指针,实际上就是返回一个内存单元的地址 注意:不能返回函数中局部变量的地址 这样的地址处于内存的栈区,函数结束时所占用的栈空间就释放了,回到主调函数后不能再使用该空间了 C++语言程序设计

17 (一)指针与函数 例:利用指针函数完成一个数组的倒序排列 C++语言程序设计
// 在指针函数reverse中,申请动态数组,最后返回这个地址 #include <iostream> using namespace std; int * reverse(int const * list, const int size); //指针函数 void printArray(int const *list, const int size); void main() { int list[] = {1, 2, 3, 4, 5, 6}; int *pList = reverse(list, 6); //获得倒序排序后数组的地址 printArray(pList, 6); //显示倒序排序后的数组 delete[]pList; } C++语言程序设计

18 (一)指针与函数 例:利用指针函数完成一个数组的倒序排列 C++语言程序设计
// 在指针函数reverse中,申请动态数组,最后返回这个地址 int * reverse(int const * list, const int size) //指针函数 { int *result = new int[size]; //函数中申请的动态数组 for (int i = 0, j = size - 1; i < size; i++, j--) result[j] = list[i]; return result; //返回动态数组的地址 } void printArray(int const *list, const int size) for (int i = 0; i < size; i++) cout << list[i] << " "; 不能在reverse函数中定义局部数组int result[6],使用堆空间是比较好的解决办法 C++语言程序设计

19 (一)指针与函数 函数指针 指针和函数有着天然的联系——函数名本身就是地址 指向函数的指针称为函数指针
声明格式: <类型名> (*指针名) (形参列表); 例如: int (*fptr)(int,int); 定义了一个函数指针fptr,它可以指向带两个整型参数且返回值类型为整型的任意函数 可使用函数名对函数指针进行初始化(赋值) 因为函数名代表函数的内存地址,所以给函数指针赋值时,直接用函数名,不需要取地址运算符& 函数指针指向某个函数后,就可以像使用函数名一样使用函数指针来调用函数了 C++语言程序设计

20 (一)指针与函数 例:使用函数指针调用函数 C++语言程序设计 // 在函数指针调用函数 #include <iostream>
using namespace std; float areaofRectangle(float width,float height) { return width*height; } float areaofTriangle(float heml,float height) return (heml*height)/2; C++语言程序设计

21 (一)指针与函数 例:使用函数指针调用函数 C++语言程序设计 void main() { 定义函数指针
float (*fptr)(float,float); float area, worh, height; cout<<"请输入矩形的宽和高:"<<endl; cin>>worh>>height; fptr = areaofRectangle; area = fptr(worh, height); cout<<"矩形的面积为:"<<area<<endl;   cout<<"请输入三角形的底和高:"<<endl; fptr = areaofTriangle; cout<<"三角形面积为:"<<area<<endl; } 定义函数指针 直接用函数名给函数指针赋值,不需要取地址运算符& 使用函数指针调用函数 C++语言程序设计


Download ppt "C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计."

Similar presentations


Ads by Google