c语言从入门到精通第11章

上传人:san****019 文档编号:70778330 上传时间:2019-01-18 格式:PPT 页数:41 大小:390.31KB
返回 下载 相关 举报
c语言从入门到精通第11章_第1页
第1页 / 共41页
c语言从入门到精通第11章_第2页
第2页 / 共41页
c语言从入门到精通第11章_第3页
第3页 / 共41页
c语言从入门到精通第11章_第4页
第4页 / 共41页
c语言从入门到精通第11章_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《c语言从入门到精通第11章》由会员分享,可在线阅读,更多相关《c语言从入门到精通第11章(41页珍藏版)》请在金锄头文库上搜索。

1、第11章 内存的快捷方式指针,指针概述 指针变量 指针与函数 void指针类型 综合应用创建简单链表 跟我上机,第11章 内存的快捷方式指针,指针概述 指针变量 指针与函数 void指针类型 综合应用创建简单链表 跟我上机,第11章 内存的快捷方式指针,指针概述 指针变量 指针与函数 void指针类型 综合应用创建简单链表 跟我上机,第11章 内存的快捷方式指针,指针概述 指针变量 指针与函数 void指针类型 综合应用创建简单链表 跟我上机,第11章 内存的快捷方式指针,指针概述 指针变量 指针与函数 void指针类型 综合应用创建简单链表 跟我上机,第11章 内存的快捷方式指针,指针概述

2、指针变量 指针与函数 void指针类型 综合应用创建简单链表 跟我上机,第11章 内存的快捷方式指针,指针概述 指针变量 指针与函数 void指针类型 综合应用创建简单链表 跟我上机,11.1 指针概述,11.1.1 内存地址 11.1.2 内存和指针,11.1.1 内存地址,在计算机程序中使用的所有数据,都必须存储在计算机的存储单元中,并且应能从计算机的存储单元中取出。每个存储单位都有唯一的地址,这就好比街道上每家每户都会有自己的门牌号码一样,如下图所示,内存中从地址1234到地址1237中,存储了一个整型数值12,而内存中地址1238中,存储了一个字符“A”。,11.1.1 内存地址,计算

3、机内存被划分成按顺序编号的内存单元,这就是地址。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。 变量是内存中某一块存储区域的名称,对变量赋值就相当于把值存储到该存储区域中,看下面的表达式:,11.1.1 内存地址,不同的计算机使用不同的复杂的方式对内存进行编号,通常程序员不需要了解给定的变量具体地址,编译器会处理细节问题,在C语言中,你只需要使用操作运算符 输出结果如下: i的值等于12,i的地址是1245052 运行的结果很清晰的显示出变量i的地址,获得变量i的地址是通过取地址运算符&。,11.1.2 内存和指针,变量的内存地址就是变量的指针。上一小节中变量

4、total的地址1234就是变量i的指针。如果有一个变量专门用来存放另一变量的指针,则它称为指针变量。下图所示的p就是一个指针变量。变量p中存放的是变量i的指针(地址),变量p就是指向i的指针变量。,11.1.2 内存和指针,定义指针变量的一般形式如下所示: 指向数据类型 *指针变量名; int i; /*声明变量i*/ int * p1; /*声明指向整型变量的指针p1*/ char c; /*声明变量c */ char * p2; /*声明指向字符型变量的指针p2*/ p1 = /*指针赋值*/,11.1.2 内存和指针,在定义指针变量时需要注意以下三点: 如果有int *p,指针变量名是

5、p ,而不是* p,*p是表达式。 在定义指针变量时必须明确其指向的数据类型。 以下是正确的赋值 int i; char c; int *p; p = /*正确的赋值,表示指针指向空*/,11.2 指针变量,11.2.1 初识指针变量 11.2.2 使用指针变量 11.2.3 指针的运算,11.2.1 初识指针变量,指针变量也是变量,假如该指针变量名叫p,变量p的用途比较特殊,它很无私,它代表的存储单元中存储的是另外一个变量的地址,假如该变量名叫a,可以理解为这个指针变量p指向变量a。当然可以直接访问a从而获得a的数据,也可以间接地通过访问p从而获得a的数据。 比如有下面的代码。 int i=

6、1; int *p= 输出结果:i=2,*p=2 代码中p=&i,表示指针变量p指向变量i,使用&取地址运算符进行关联的;代码*p=*p+1表示改变指针变量p指向的变量的值,使用的*指针运算符间接访问变量i。,11.2.1 初识指针变量,【范例11-1】 初始指针变量 01 #include /*包含标准输入输出头文件*/ 02 int main (void) 03 04 int i,*p1; 05 char c,*p2; 06 i=12; /*变量i初始化*/ 07 c=A; /*变量c初始化*/ 08 p1= /*输出p2,&p2,*p2的值*/ 14 return 0; 15 ,11.2

7、.1 初识指针变量,【范例11-2】 输入两个整数,存储在变量a和b中,当a小于b时,使用指针交换a和b并输出。 01 #include 02 int main(void) 03 04 int a,b; 05 int *p1,*p2,*p; /*声明三个指针变量*/ 06 p1= 19 ,11.2.1 初识指针变量,11.2.2 使用指针变量,【范例11-3】 输入三个不同的整数,存储在变量a,b和c中,使用指针交换,按照从大到小顺序排序,并输出。,11.2.2 使用指针变量,【扩展训练】 范例中部分代码修改如下: int *p1= ,11.2.2 使用指针变量,代码再次修改如下: int *

8、p1= ,11.2.2 使用指针变量,【范例11-4】 使用函数实现对输入的两个整数按从大到小顺序排序输出。,11.2.2 使用指针变量,调用swap函数前,指针指向如图所示,调用swap函数,把实参point1和point2传递给了形参p1和p2后,执行swap函数前,指针指向如图所示。,11.2.2 使用指针变量,交换函数执行后,调用并执行swap函数,在还没有返回到主函数前,这里交换的变量a和b的值,point1和point2,p1和p2的指向并没有变,还是指向原来的存储单元,但是a和b变量的值发生了交换,指针指向如图所示。,调用swap函数后,主函数输出结果,指针指向如图所示。,11.

9、2.2 使用指针变量,【拓展训练】 02 void swap(int *p1,int *p2) /*形参为指针变量*/ 03 04 int *temp; /*临时量*/ 05 temp=p1; /*把指针p1所指向的地址中的值暂存在temp中*/ 06 p1=p2; /*把指针p2所指向的地址中的值存在p1错指向的地址中*/ 07 p2=temp; /*把temp中值存储到p2所指向的地址中*/ 08 printf(“swap函数中的输出n“); 09 printf(“*p1=%d,*p1=%dn“,*p1,*p2); 10 ,11.2.2 使用指针变量,调用swap函数,把实参point1和

10、point2传递给了形参p1和p2后,执行swap函数前:,交换函数执行后,调用并执行swap函数,在没有返回到主函数前:,11.2.3 指针的运算,针的运算就是地址的运算。由于这一特点,指针运算不同于普通变量,只允许有限的几种运算。除了可以对指针赋值外,指针的运算还包括移动指针、两个指针相减、指针与指针或指针与地址之间进行比较等。可以通过将指针加减一个整数,或者通过对指针赋值来移动指针。 例如:p+n、p-n、p+、p-、+p和-p等,其中n是整数。 将指针p加上或者减去一个整数n,表示p向地址增加或减小的方向移动n个元素单元,从而得到一个新的地址,使能访问新地址中的数据。每个数据单元的字节

11、数取决于指针的数据类型。,11.2.3 指针的运算,如下图所示,变量a,b,c,d和e都是整型数据int类型,它们在内存中占据一块连续的存储区域,地址从1234到1253,每个变量占用4个字节。指针变量p指向变量a,也就是p的值是1234,那么p+1按照上面的描述,表示p向地址增加的方向移动了4个字节,从而指向一个新的地址,这个值就是1238,指向了变量b(变量从a到e占用一块连续的存储区域),同理p+2地址就是1242,再次增加了4个字节,指向了变量c,依次类推。,11.2.3 指针的运算,【范例11-5】 指针变量自身的运算 01 #include 02 int main(void) 03

12、 04 int a=1,b=10; 05 int *p1,*p2; 06 p1= 14 ,11.3 指针与函数,11.3.1 指向函数的指针 11.3.2 返回指针的函数,11.3.1 指向函数的指针,用指针变量可以指向一个函数。函数在程序编译时被分配了一个入口地址。这个函数的入口地址就称为函数的指针。 函数指针变量常用的用途之一是把指针作为参数传递到其他函数。指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。,11.3.1 指向函数的指针,【范例11-6】 指向函数的指针,11.3.2 返回指针的函数,函数可以返回数值型、字符型、布尔型等数据,也可以

13、带回指针型的数据叫做返回指针值的函数。定义形式为: 类型名 *函数名(参数表列); 例如下式表示的含义是,max函数调用后返回值的数据类型是整型指针。 int *max(int *x, int *y);,11.3.2 返回指针的函数,【范例11-7】 返回指针的函数,11.4 void指针类型,void指针类型,它可以用来指向一个抽象的类型的数据,在将它的值赋给另一指针变量时要进行强制类型转换使之适合于被赋值的变量的类型。 通过具体的例子来说明void指针类型的含义和用法,如下代码所示: char *p1; void *p2; p1=(char *)p2; 同样可以使用(void *)p1将p

14、1转换成void * 类型,如下代码所示: p2=(void *)p1;,11.4 void指针类型,不只对变量可以使用void指针类型,也可以将一个函数定义为void *类型。比如下面代码,表示函数fun返回的是一个地址,它指向空类型,如需要引用此地址,也需要根据情况对之进行类型转换,如对该函数调用得到的地址要进行以下转换。如下代码所示: void * fun(char ch1,char ch2); p1=(char *)fun(ch1,ch2);,11.5 综合应用创建简单链表,【范例11-8】 创建简单链表 单链表是一种简单的链表表示,也叫做线性链表。用它来表示线性表时,用指针表示结点间的逻辑关系。因此单链表的一个存储结点包含两部分内容。,11.5 综合应用创建简单链表,data部分称为数据域,用于存储线性表的一个数据元素;link部分称为指针域,用于存放一个指针,该指针指示该链表下一个结点的开始存储地址。,11.7 跟我上机,1. 编写C程序,使用指针,实现以下功能: 输入三个整数,按照从大到小顺序输出,使用指针变量进行交换。,11.7 跟我上机,2. 编写C,使用指针,实现以下功能: 调用函数fun(),调用函数,同时使用返回指针的函数和引用方法,得到函数的最大值和最小值。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号