C大学基础教程第六章课件.ppt
《C大学基础教程第六章课件.ppt》由会员分享,可在线阅读,更多相关《C大学基础教程第六章课件.ppt(81页珍藏版)》请在三一办公上搜索。
1、2022/12/20,1,C+大学基础教程,第6章 指针和引用,2022/12/20,2,指针(Pointer)是C+和C的一种数据类型。很多其他高级语言也有类似的数据类型。引用(Reference)则是C+所特有的一种数据类型。,2022/12/20,3,第六章 指针和引用,6.1 指针的概念 6.2 指针的运算 6.3 指针和函数 6.4 指针和字符串 6.5 通过指针访问数组 6.6 指针访问动态内存6.7 引用概念,2022/12/20,4,6.1 指针的概念,2022/12/20,5,6.1.1 指针和指针变量,指针是变量的地址例如,定义整型变量a,a的地址就是 一个指针。直接指定内
2、存某个地址开始(如 0 x00430100)存放指针的变量就是指针变量。,2022/12/20,6,6.1.1 指针和指针变量,当声明了一个指针变量后,确定了三件事:1. 变量本身在内存中所分配的地址和字节数(4个)2. 系统允许的地址范围,及地址单元内可以存放的内容3. 指针变量可以进行的运算访问指针变量时,只能看到地址通过这个地址访问地址单元中的内容,这样的访问称为对于内存单元的间接访问。,2022/12/20,7,6.1.2 指针变量的声明和初始化,指针变量声明的格式是: 类型名 *变量名1, *变量名2;例如: int *va1, *va2; char *ch1, *ch2;指针变量在
3、声明后,变量的值(地址)是随机的。这样的指针变量是不能安全的使用的,2022/12/20,8,6.1.2 指针变量的声明和初始化,在声明指针变量时的“*”,有两个含义:声明变量va1、ch1、ch2都是指针变量;说明变量va1的类型是(int *)型,即指向整型变量的指针。ch1和ch2的类型是(char *)型指针变量都是有类型的- 所指定的地址单元中存放的数据的类型,2022/12/20,9,6.1.2 指针变量的声明和初始化,指针变量必须初始化后才能安全使用声明指针变量时进行初始化的格式: 类型名 *指针变量名=,2022/12/20,10,6.1.2 指针变量的声明和初始化,赋值方式进
4、行初始化:int i1=Y, i2=A; int *pi1, *pi2;pi1=没有初始化的指针变量不可以使用 (编译系统会给出警告,而运行时会出现错误),2022/12/20,11,6.2 指针的运算,2022/12/20,12,6.2 指针的运算,表6.1 指针的运算,2022/12/20,13,6.2.1 指针的赋值运算,指针的赋值: 地址的赋值同类型变量的地址同类型的已经初始化的指针变量;其他同类型的指针用0或者NULL赋值 “空指针”,即不指向任何的内存物理地址不同类型的指针不可以互相赋值在指针赋值时,不存在类型自动转换的机制,2022/12/20,14,例6.1 观察以下指针赋值运
5、算的结果。如果将注释去掉,结果将如何?#include using namespace std;void main()int va1=100,*pva1; int *pva2=NULL; float vf1=A,*pvf1,*pvf2;coutvalue of pva2 is pva2endl; pva1=,value of pva2 is 0 x000000000 x0012FF7C 0 x0012FF7C0 x0012FF74 0 x0012FF74 注释去掉会出现编译错误,2022/12/20,15,6.2.2 间接引用运算,间接引用运算符“*” :一元运算符和指针变量连用,对指针所指向
6、的内存地址单元进行间接访问使用的格式: *指针变量 如果指针变量iptr指向整型变量va*iptr就是变量va的内容,2022/12/20,16,例6.2 对变量的直接访问和间接访问#include using namespace std; void main()char ch1=a,*ch; int k1=100; ch= /间接访问 ,运行结果:*ch=ach1=B*ch=d,2022/12/20,17,例6.3 观察对这种指针变量间接访问的结果。#include using namespace std;void main() int va=100,*pva,*ppva; /ppva是指向
7、指针的指针 int k1=100; pva= /就是指针pva的内容,运行结果:*pva=100*ppva=0 x0012FF7C pva=0 x0012FF7C,2022/12/20,18,6.2.2 间接引用运算,2022/12/20,19,6.2.3 指针的算术运算,可以进行的只有加法和减法-和整数n做加法或者减法,指针p和整数n相加(相减)的含义是指向当前指向位置p的前方或后方第n个数据的地址。,2022/12/20,20,例6.4 通过指针的间接访问,输出下标为偶数的数组元素的值。#include using namespace std;void main() int k110=11
8、,24,37,44,58,66,79,86,93,108,*k; k=,运行结果:K10=11 k12=37.,数组第一个元素(下标为0)的地址赋值给指针k,每次循环,指针加2,2022/12/20,21,6.2.3 指针的算术运算,指针和指针的直接加法没有意义指针和指针的减法可以进行-求出两个指针之间可以存放几个指定类型的数据不允许用一个整数减一个指针,2022/12/20,22,6.2.4指针的关系运算和逻辑运算,同类型的指针可以进行关系运算进行指针“大于”、“小于”的比较,是判定指针在内存中的相对位置 指针和一般的整数比较没有意义,也不允许惟一可以和指针比较的整数是0。判定指针是不是空指
9、针,2022/12/20,23,6.2.5 void类型指针,void类型的指针就是“无类型”指针: void *指针名;存放的也是内存的地址,但不指定这个地址单元内的数据的类型,2022/12/20,24,6.2.5 void类型指针使用要点,-任何指针都可以赋值给void指针 赋值后的void指针的类型仍然是void -void指针不可以赋值给其他任何类型的指针 -void指针不可通过间接引用访问内存中数据 -必须进行指针类型的强制转换,才可以使用指针间接引用访问内存数据,2022/12/20,25,例6.5 使用memcpy通用复制函数复制数组原型 void *memcpy(void *
10、dest, const void*, size) #include using namespace std; #include void main() char src10=012345678; char dest10; char* pc=(char*)memcpy(dest,src,10); cout pc endl; int s13=1,2,3; int d13; int *pi=(int*)memcpy(d1,s1,12); cout*pi *(pi+1) *(pi+2)endl;,运行结果:0123456781 2 3,复制字符数据,10个字节,复制整型数据,12个字节,2022/12
11、/20,26,6.2.5 void类型指针,void类型指针应用:显示字符指针的内容其他指针直接用cout语句输出地址值而字符指针输出的是字符串将字符指针强制转换为void指针cout语句输出便是地址值例:char *pch=Hello C+; coutpchendl; cout(void*)pchendl;,2022/12/20,27,指针是地址,int *p;p=,*p=100; b=*p+2;,2022/12/20,28,6.3 指针和函数,2022/12/20,29,6.3 指针和函数,在程序设计中,指针有很多应用其中之一就是作为函数的参数,形成了C+函数调用中的另一种调用方式:地址调
12、用,2022/12/20,30,6.3.1 指针作为函数的参数,实现地址调用,必须满足以下条件: 函数的形式参数是指针变量; 函数的实参数是内存的地址(可以是数组名、变量的地址、用变量地址初始化的指针)形参指针类型和实参地址类型必须相同,2022/12/20,31,6.3.1 指针作为函数的参数,实参传递给形参的是内存的地址,所以形参指针指向实参变量 形参指针通过间接引用,直接访问实参变量 (包括改变实参变量的值)函数调用后,改变了实参,如果有多个实参,就可以有多个实参变量在函数调用中被修改,2022/12/20,32,例6.6 编写数据交换的函数。#includevoid Swap(int
13、*a, int *b);void main()int x(5), y(10); cout主函数变量的值: x=x y=yendl;Swap(,运行结果:主函数变量的值:x=5 y=10函数中完成了交换:*a=10 *b=5返回后变量的值: x=10 y=5,变量的地址作为实参数,指针变量作为形式参数,2022/12/20,33,6.3.1 指针作为函数的参数,变量x和y的地址作实参传递给指针a和b,如图(a)通过间接引用*a和*b进行交换,实际上就是x和y进行交换,如图(b),2022/12/20,34,例6.7 指针变量指向一个数组 #includeusing namespace std;v
14、oid Move(int *a);void main()int x5=10,20,30,40,50, *px=x;cout调用前的*px=*pxendl; Move(px);cout调用后的px;if(px=x)cout没有变化,*px还是*pxendl;else cout也向前移动,*px变为*pxendl;void Move(int *a)a=a+1; *a=100; cout“函数中完成了指针移动:*a=*aendl;,运行结果:调用前的*px=10 函数中完成了指针移动:*a=20 调用后的px没有变化*px还是10,指针作为实参数,指针变量作为形式参数,2022/12/20,35,6
15、.3.3 传递参数的保护:指针和常量,通过数组名地址调用,可以改变实参数组内容但有时并不需要改变数组的值 例如,在调用一个求数组最大值的函数时,就不希望数组的值发生变化 希望在函数中能够限制对数组元素的修改使用常指针可以达到这个目的,2022/12/20,36,6.3.3 传递参数的保护:指针和常量,常指针是指向常量的指针(Pointer to Constant data) 规定指针所指向的内容不可以通过指针的间接引用来改变。 常指针说明的格式是: const 类型名 *指针名; 例如: const int *ptint; 指针ptint的类型是(const int *),即指向一个恒定的整型
16、数,2022/12/20,37,例6.10 常指针示例。观察以下程序的运行。 #include using namespace std;void main()int ia=10, ib=20;const int *ptint; ptint= /语句错误:左值是常量,运行结果:10 120,常指针声明,注释去掉会出现编译错误,2022/12/20,38,6.3.3 传递参数的保护:指针和常量,指针常量(Pointer constant)指针本身是常量(地址是常量),不可以改变指针常量声明的格式: 类型名 *const 指针名=初值; char ch, *const ptch= 数组名是数组的首地
17、址-数组名是指针常量,2022/12/20,39,例6.11 指针常量示例。指出以下程序的错误。 #include using namespace std;void main() int a=10, b=100; int *const pa=,错误语句注释掉后运行结果:10 20,语句有错:常量不能当左值,语句有错,地址类型不同不能用常量地址初始化指针常量,2022/12/20,40,例6.12 用常指针作形参,函数printString可以输出数组的内容,不可以对数组修改。 #include using namespace std;void printString( const char *
18、 );void main() char phrase = C+ is a programming language; cout The string is:n; printString( phrase ); cout endl; / main函数结束void printString( const char *Ptarray ) while(*Ptarray) cout *Ptarray+;,不使用常指针也是可以完成打印。但是没有保护了。,数组名作实参数,常指针作形式参数,2022/12/20,41,6.4 指针和字符串,2022/12/20,42,6.4.1 字符串处理的两种方式,字符串常量:
19、双引号括起,0结束 如:This is a string。 字符串常量有自己固定的首地址 如果将字符串常量的首地址看成是指针,这种指针既是常指针,也是指针常量。,2022/12/20,43,6.4.1 字符串处理的两种方式,处理字符串两种方式:数组方式和指针方式 数组方式是将字符串存入字符数组: char string_array =Whats a nice day!; 指针方式是用字符串常量来初始化一个字符指针: char *string_pt=Whats a nice day!;,2022/12/20,44,6.4.1 字符串处理的两种方式,指针常量不能放在等式左边,运行时会出错,2022
20、/12/20,45,6.4.2 字符串操作函数,实参数:字符数组名、已经初始化的字符指针,字符串常量目的串必须是可写的。,2022/12/20,46,例6.14 strcpy和strncpy的比较。 #include void main() int n; char *array1 = Happy Birthday to You; char array3 15 ; char array2 25 ; strcpy( array2, array1 ); cout The string in array1 is: array1 nThe string in array2 is: array2 n; /
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 基础教程 第六 课件
链接地址:https://www.31ppt.com/p-1828063.html