C语言入门学习-C第10章-指针课件.ppt





《C语言入门学习-C第10章-指针课件.ppt》由会员分享,可在线阅读,更多相关《C语言入门学习-C第10章-指针课件.ppt(81页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十章第十章C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 2l l 主要内容 10.1 10.1地址和指针的概念地址和指针的概念 10.210.2变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 10.310.3数组与指针数组与指针 10.410.4字符串与指针字符串与指针 10.510.5指向函数的指针指向函数的指针 10.610.6返回指针值的函数返回指针值的函数 10.710.7指针数组和指向指针的指针指针数组和指向指针的指针 10.810.8有关指针的数据类型和指针运算的小结有关指针的数据类型和指针运算的小结C程序设计(第三版)程序设计(第三版)
2、江苏大学 计算机科学与通信工程学院 3 10.1 10.1地址和指针的概念地址和指针的概念内存区的每一个字节有一个编号,这就是“地址地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。.按变量地址存取变量值的方式称为“直接访问直接访问”方式 (,);(,);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 4C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 52.另一种存取变量值的方式称为“间接访问间接访问”的方式。即,将变量的地址存放在另一个变量中。在语言中,指针是一种特殊的变量,它是在语言中,指针是一种特殊
3、的变量,它是存放地址的。存放地址的。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 6一个变量的地址称为该变量的“指针指针”。例如,地址2000是变量的指针-计算机给变量i分配存储空间的中的第一个字节的字节编号。如果有一个变量(计算机也给这个变量分配了存储空间)专门用来存放另一变量的地址(即指针),则它称为“指针变量指针变量”。上述的i_pointer就是一个指针变量。指针和指针变量的定义:指针和指针变量的定义:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 7 10.2 10.2 变量的指针和指向变量的指变量的指针和指向变量的指 针变量针变
4、量10.10.1.1 定义一个指针变量定义一个指针变量定义指针变量的一般形式为基类型基类型 *指针变量名;指针变量名;这里的这里的*不是运算不是运算C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 8下面都是合法的定义:float *pointer_;char*pointer_;可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。例如:例如:pointer_;pointer_;C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 9(1)指针变量前面的“*”,表示该变量的类型为指针型变量。例:float *pointer_1;指
5、针变量名是pointer_1,而不是*pointer_1。(2)在定义指针变量时必须指定基类型。基类型不基类型不是指针变量的类型。是指针变量的类型。基类型:指针变量里面存放的是内存中的一基类型:指针变量里面存放的是内存中的一个字节编号,在这个编号所对应的存储空间里面存个字节编号,在这个编号所对应的存储空间里面存放的数据类型。放的数据类型。在在定义定义指针变量时要注意两点:指针变量时要注意两点:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 10int*a 指针变量a的基类型是intfloat*b 指针变量b的基类型是float下面的赋值是错误错误的 float a;i
6、nt *pointer_1;基类型为int pointer_1=&a;变量a的类型为float 需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 1110.2.2 10.2.2 指针变量的引用指针变量的引用 注意注意:指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。例例10.通过指针变量访问整型变量通过指针变量访问整型变量#include void main()int a,b;int*pointer_1,*pointer_2;a=100;b=10;poin
7、ter_1=&a;/*把变量的地址赋给 pointer_1*/C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 12pointer_2=&b;/*把变量的地址赋给 pointer_2*/printf(%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 13对对“”和和“*”运算符说明:运算符说明:如果已执行了语句 pointer_;(1)*pointer_的含义是什么?的含义是什么?“”和“*”两个运算符的优先级别相同,但按自右而左方向结合。因此,*p
8、ointer_与相同,即变量a的地址。如果有pointer_2*pointer_;它的作用是将(的地址)赋给pointer_2,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。注:指针变量的值为某个变量的地址,则是指针变量指向某个变注:指针变量的值为某个变量的地址,则是指针变量指向某个变量。后面图示上用了一个符号量。后面图示上用了一个符号 来表示。来表示。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 14C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 15(2)*的含义是什么?的含义是什么?先进行运算,得的地址,再进
9、行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。(3)(*pointer_)相当于。)相当于。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 16例例10.2 输入和两个整数,按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出 和。和。#include void main()int*p1,*p2,*p,a,b;scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(max=%d,min=%dn,*p1,*p2);C程序设计(
10、第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 17运行情况如下:运行情况如下:,当输入,时,由于,当输入,时,由于,将和交换。交换前的情况见图将和交换。交换前的情况见图(),交换后见图()。(),交换后见图()。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 1810.2.3 10.2.3 指针变量作为函数参数指针变量作为函数参数例例10.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出#includevoid main()void swap(int*p1,int*p2);int a,b;int*pointer_1,*pointer_2
11、;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 19void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 20C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 21 10.3 10.3 数组与指针数组与指针 一个变量
12、有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元数组元素的指针就是数组元素的地址素的地址。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 22定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。例如:例如:;(定义为包含个整型数据的数组)*;(定义为指向整型变量的指针变量)应当注意,如果数组里存放的数据为型,则指针变量的基类型亦应为型。10.3.1 10.3.1 指向数组元素的指针指向数组元素的
13、指针C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 23对该指针变量赋值:对该指针变量赋值:;把元素的地址赋给指针变量。也就是使指向数组的第位置上的元素,如图:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 2410.3.210.3.2通过指针引用数组元素通过指针引用数组元素引用一个数组元素,可以用:()()下标法,如形式;下标法,如形式;以前学的内容以前学的内容()()指针法,如指针法,如*()或()或*()()。其中是数组名(数据在计算机中存储的地址),是指向数组元素的指针变量,其初值。例例10.5 输出输出数组中的全部元素。数组中的全部
14、元素。假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 25(1)下标法。下标法。#include void main()int a10;int i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,ai);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 26(2)通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。#include void main()int a10;int
15、 i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,*(a+i);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 27(3)用指针变量指向数组元素。用指针变量指向数组元素。#include void main()int a10;int*p,i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(p=a;p(a+10);p+)printf(%d,*p);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 28例例10.通过指针变量通过
16、指针变量输出输出数组的个元素。数组的个元素。#include void main()int *,;for(;)scanf(,);printf();for(;,)printf(,*);程序运行情况:程序运行情况:1 2 3 4 5 6 7 8 9 022153 234 0 0 30036 25202 11631 8259 8237 28483显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值 通过调试程序找出程序的问题?通过调试程序找出程序的问题?C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 29*和和和和+运算符运算符运算符运算符仔细理解,*和
17、+是同级运算符,结合方向为自右而左*p+等同于*(p+),先执行*p,然后p=p+1*+p 等同与*(+p),先执行p=p+1,然后执行*p(*p)+,先执行*p,然后使得*p的值加1+(*p),先使得*p的值加1,然后执行*p通过程序10-6-1.c加深理解C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 3010.3.3 10.3.3 用数组名作函数参数用数组名作函数参数在第在第8章章8.7节中介绍过可以用数组名作函数的参数节中介绍过可以用数组名作函数的参数如:void main()(int arr,int);int array;(array,);void(int
18、arr,int)C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 31例例10.将数组中个整数按相反顺序存放。将数组中个整数按相反顺序存放。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 32#include void main()void inv(int x,int n);int i,a10=3,7,9,11,0,6,7,5,4,2;printf(The original array:n);for(i=0;i0;i+)printf(%d,ai);printf(n);inv(a,10);printf(The array has been in
19、verted:n);for(i=0;i10;i+)printf(%d,ai);printf(n);C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 33void inv(int ,int)/*形参x是数组名*/int temp,();for(;);temp;temp;return;运行情况如下:运行情况如下:The original array:,The array has been inverted:,C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 34#include void main()void inv(int*,int);int,;p
20、rintf(The original array:);for(;)printf(,);printf();inv(,);printf(The array has been in verted:);for(;)printf(,);printf();对刚才的程序可以作一些改动。将对刚才的程序可以作一些改动。将函数函数inv中的形参改成指针变量。中的形参改成指针变量。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 35void inv(int*,int)/*形参x为指针变量*/int*,temp,*,*,();for(;,)temp*;*;*temp;return;C程序设计
21、(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 36如果有一个实参数组,想在函数中改变此数如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有组中的元素的值,实参与形参的对应关系有以下种情况:以下种情况:(1)形参和实参都用数组名,如:形参和实参都用数组名,如:void main()void (int ,int)int;(,);形参和实参都用数组名在例形参和实参都用数组名在例10.7程序已实现 C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 37(2)实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:void
22、main()void(int*,int)int ;(,);实参用数组名,形参用指针变量在实参用数组名,形参用指针变量在10-7-2.c程序中实现(3)实参形参都用指针变量。例如:实参形参都用指针变量。例如:void main()void(int*,int)int,*p=a;(p,);10.7程序改写为例10.8实现实参形参都用指针变量实参形参都用指针变量C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 38(4)实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:void main()void(int x,int)int,*p=a;(p,);将例10.7
23、程序中的函数inv替代10.8中的inv函数,编写程序10-7-4.c,实现实参为指针变量,形实参为指针变量,形参为数组名参为数组名C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 39例例109 用选择法对个整数按由大到小顺序排序。用选择法对个整数按由大到小顺序排序。函数sort的功能为用选择法对个整数按由用选择法对个整数按由大到小顺序排序大到小顺序排序 本程序实现实参为指向一维数组的指针变量,本程序实现实参为指向一维数组的指针变量,形参为一维数组名形参为一维数组名 在理解程序的基础上,改写程序实现在理解程序的基础上,改写程序实现实参形参都用指针变量实参形参都用指针变
24、量实参用数组名,形参用指针变量实参用数组名,形参用指针变量 C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 4010.3.4 10.3.4 多维数组与指针多维数组与指针 用指针变量可以指向一维数组中的元素,前面的知识可知地址+整数仍然为一个地址值*(地址+整数)等价地址整数1.1.多维数组元素的地址多维数组元素的地址例:定义二维数组定义二维数组int a34则二维数组名a的值是第一个元素存储空间的字节编号(第一个元素的地址)指针变量也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。C程序设计(第三版)程序设计(第三版)江苏大学
25、计算机科学与通信工程学院 41定义二维数组为int a34=1,2,3,4,5,6,7,8,9,10,11,12;调试程序在watch窗口理解a0,a1,a2,a+1的数值 二维数组是“数组的数组”,集合中的元素为一个集合。因此,可以理解二维数组由3个元素组成,每个元素是一个一维数组,即a0,a1,a2。地址值+1表示下一个数据的地址值概念可知,a+1就是下一个元素的地址,即a1这个元素的地址,得出a+1的值就是二维数组第二行数据在计算机中的存储地址。C程序设计(第三版)程序设计(第三版)江苏大学 计算机科学与通信工程学院 42*(地址(地址+整数)整数)地址地址整数整数a0 和*(a+0)等
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 入门 学习 10 指针 课件

限制150内