《C/C程序设计》第06章(复合数据类型).ppt
《《C/C程序设计》第06章(复合数据类型).ppt》由会员分享,可在线阅读,更多相关《《C/C程序设计》第06章(复合数据类型).ppt(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、6.1 指针类型指针类型概念:概念:概念:概念:旅馆房间、房间编号、房间名称、派房牌(上写房间号)。旅馆房间、房间编号、房间名称、派房牌(上写房间号)。旅馆房间、房间编号、房间名称、派房牌(上写房间号)。旅馆房间、房间编号、房间名称、派房牌(上写房间号)。1 1)地址)地址)地址)地址 给内存单元(一般是字节)的编号给内存单元(一般是字节)的编号给内存单元(一般是字节)的编号给内存单元(一般是字节)的编号 。计算机根据它找到对应的字节进行。计算机根据它找到对应的字节进行。计算机根据它找到对应的字节进行。计算机根据它找到对应的字节进行访问(存取)。访问(存取)。访问(存取)。访问(存取)。高级语
2、言中定义一个变量,编译时根据其类型分配相应数目的字节(如高级语言中定义一个变量,编译时根据其类型分配相应数目的字节(如高级语言中定义一个变量,编译时根据其类型分配相应数目的字节(如高级语言中定义一个变量,编译时根据其类型分配相应数目的字节(如int int 型分型分型分型分2 2个字节,个字节,个字节,个字节,float float 分分分分4 4个字节),将变量名与对应内存字节映射。个字节),将变量名与对应内存字节映射。个字节),将变量名与对应内存字节映射。个字节),将变量名与对应内存字节映射。变量名变量名变量名变量名 地址地址地址地址 内存单元内存单元内存单元内存单元 2 2)指针)指针)
3、指针)指针 给变量、数组、结构体、函数等分配的内存单元或块区的首地址。给变量、数组、结构体、函数等分配的内存单元或块区的首地址。给变量、数组、结构体、函数等分配的内存单元或块区的首地址。给变量、数组、结构体、函数等分配的内存单元或块区的首地址。假如有:假如有:假如有:假如有:long m=56000 long m=56000 则则则则 :&m&m 就是就是就是就是 m m的指针或者说是的指针或者说是的指针或者说是的指针或者说是 m m所占内存所占内存所占内存所占内存单元的首地址。此例中,单元的首地址。此例中,单元的首地址。此例中,单元的首地址。此例中,5600056000就放在从这个地址开始的
4、连续四个字节中。就放在从这个地址开始的连续四个字节中。就放在从这个地址开始的连续四个字节中。就放在从这个地址开始的连续四个字节中。3 3)指针变量)指针变量)指针变量)指针变量 定义一种特殊变量,这种变量专门存放指针,用它也可找到(指向)变定义一种特殊变量,这种变量专门存放指针,用它也可找到(指向)变定义一种特殊变量,这种变量专门存放指针,用它也可找到(指向)变定义一种特殊变量,这种变量专门存放指针,用它也可找到(指向)变量、数组、结构体、函数,这样的变量量、数组、结构体、函数,这样的变量量、数组、结构体、函数,这样的变量量、数组、结构体、函数,这样的变量 称作指针变量。称作指针变量。称作指针
5、变量。称作指针变量。按变量是直接寻址;按指针变量是间接寻址。按变量是直接寻址;按指针变量是间接寻址。按变量是直接寻址;按指针变量是间接寻址。按变量是直接寻址;按指针变量是间接寻址。由于变量、数组、结构体、函数等所分配的内存单元或块区的大小及结由于变量、数组、结构体、函数等所分配的内存单元或块区的大小及结由于变量、数组、结构体、函数等所分配的内存单元或块区的大小及结由于变量、数组、结构体、函数等所分配的内存单元或块区的大小及结构不同,指针变量因而也要定义成相应的类型,不能混用。构不同,指针变量因而也要定义成相应的类型,不能混用。构不同,指针变量因而也要定义成相应的类型,不能混用。构不同,指针变量
6、因而也要定义成相应的类型,不能混用。例例例例 交换两数。交换两数。交换两数。交换两数。void swap();void swap();main()main()int a,b;int a,b;scanf(%d%d”,&a,&b);scanf(%d%d”,&a,&b);swap(&a,&b);swap(&a,&b);printf(“%d,%d”,a,b);printf(“%d,%d”,a,b);void swap(int *p1,int*p2)void swap(int *p1,int*p2)int t;int t;t=*p1,*p1=*p2,*p2=t;t=*p1,*p1=*p2,*p2=t;2
7、000H2001H2EA0H2EA1Ha=10 b=8内存 地址变量108指针变量p2=&b=2EA0H:3100H3101H3802H3803H2000H2EA0Hp1=&a=2000H变量的指针变量变量的指针变量 1)1)指针变量的定义指针变量的定义指针变量的定义指针变量的定义 *;例例例例 int *p1,*p2;int *p1,*p2;2)2)指针变量的赋值指针变量的赋值指针变量的赋值指针变量的赋值 指针变量指针变量指针变量指针变量=&=&变量变量变量变量 例例例例 先定义后赋值:先定义后赋值:先定义后赋值:先定义后赋值:p1=&a;p2=&b;p1=&a;p2=&b;定义时赋初值:定
8、义时赋初值:定义时赋初值:定义时赋初值:int a,*prt=&a;int a,*prt=&a;其中其中其中其中:&:&是取指针(地址)运算符。是取指针(地址)运算符。是取指针(地址)运算符。是取指针(地址)运算符。赋初值问题:一个指针变量被定义后,在赋予某一变量的指针以前,其赋初值问题:一个指针变量被定义后,在赋予某一变量的指针以前,其赋初值问题:一个指针变量被定义后,在赋予某一变量的指针以前,其赋初值问题:一个指针变量被定义后,在赋予某一变量的指针以前,其值是随机的,这个随机数可能恰好是系统区的某单元的地址。在系统不知和值是随机的,这个随机数可能恰好是系统区的某单元的地址。在系统不知和值是
9、随机的,这个随机数可能恰好是系统区的某单元的地址。在系统不知和值是随机的,这个随机数可能恰好是系统区的某单元的地址。在系统不知和不受系统管理的情形下改写其中内容是危险的。变量的地址是由系统分配和不受系统管理的情形下改写其中内容是危险的。变量的地址是由系统分配和不受系统管理的情形下改写其中内容是危险的。变量的地址是由系统分配和不受系统管理的情形下改写其中内容是危险的。变量的地址是由系统分配和管理的,因而是安全的。管理的,因而是安全的。管理的,因而是安全的。管理的,因而是安全的。3 3)指针变量的使用)指针变量的使用)指针变量的使用)指针变量的使用 p1=&a;p2=&b;scanf(“%d%d”
10、,p1,p2);p1=&a;p2=&b;scanf(“%d%d”,p1,p2);t=*p1;*p1=*p2;*p2=t;t=*p1;*p1=*p2;*p2=t;其中:其中:其中:其中:*号是取值运算符。号是取值运算符。号是取值运算符。号是取值运算符。*与与与与&是一对互逆运算。是一对互逆运算。是一对互逆运算。是一对互逆运算。例如:例如:例如:例如:*(&a)a&a)a ;&(*p)p&(*p)p *指针变量指针变量指针变量指针变量 变量变量变量变量 例如例如例如例如:p=&a;*p:p=&a;*p 就是就是就是就是a;a;定义时的定义时的定义时的定义时的*与使用时的与使用时的与使用时的与使用时
11、的*含义不同,前者表示定义含义不同,前者表示定义含义不同,前者表示定义含义不同,前者表示定义的是指针变量;后者是对变量的取值运算。的是指针变量;后者是对变量的取值运算。的是指针变量;后者是对变量的取值运算。的是指针变量;后者是对变量的取值运算。定义了一个某类型的指针变量后,它可以指向任意定义了一个某类型的指针变量后,它可以指向任意定义了一个某类型的指针变量后,它可以指向任意定义了一个某类型的指针变量后,它可以指向任意一个同类型变量。一个同类型变量。一个同类型变量。一个同类型变量。4 4)指针变量作函数参数)指针变量作函数参数)指针变量作函数参数)指针变量作函数参数 主调函数主调函数主调函数主调
12、函数 被调函数被调函数被调函数被调函数 实参实参实参实参 形参形参形参形参&a p&a p p p p p 6.2 数组类型数组类型数组的特点:数组的特点:(1)(1)数数组组中中的的每每一一个个元元素素均均属属于于同同一一类类型型,我我们们称称这这种种类类型为数组的基类型;型为数组的基类型;(2)(2)每每个个数数组组中中的的元元素素个个数数一一经经确确定定后后就就保保持持不不变变,我我们们称它为数组的长度;称它为数组的长度;(3)(3)数数组组中中的的每每个个元元素素均均为为变变量量,我我们们用用数数组组下下标标来来直直接接访问数组的元素;访问数组的元素;(4)(4)数数组组中中的的元元素
13、素还还允允许许是是数数组组类类型型,从从而而产产生生二二维维数数组组、多维数组等结构;多维数组等结构;(5)(5)在在数数组组定定义义中中,常常量量表表达达式式的的值值虽虽然然指指出出了了数数组组元元素素的个数,但的个数,但CC编译器不做越界检查;编译器不做越界检查;(6)数数组组名名表表示示数数组组所所用用空空间间的的首首地地址址,也也就就是是数数组组第第0个个元元素的地址。是一个常量地址。素的地址。是一个常量地址。一、一维数组的声明一、一维数组的声明 格式:类型格式:类型 数组名数组名常量表达式常量表达式;二、一维数组的引用与初始化二、一维数组的引用与初始化引用形式:引用形式:引用形式:引
14、用形式:数组名数组名数组名数组名 下标下标下标下标 初始化形式:存储类别初始化形式:存储类别初始化形式:存储类别初始化形式:存储类别 数据类型数据类型数据类型数据类型 数组名数组名数组名数组名 数组长度数组长度数组长度数组长度=初始化值初始化值初始化值初始化值;例:例:例:例:static int a5=10,20,30,40,50;static int a5=10,20,30,40,50;一般要求:只有定义为静态或外部存储的才能初始化。一般要求:只有定义为静态或外部存储的才能初始化。一般要求:只有定义为静态或外部存储的才能初始化。一般要求:只有定义为静态或外部存储的才能初始化。三、数组作为函
15、数的参数(传递地址)三、数组作为函数的参数(传递地址)三、数组作为函数的参数(传递地址)三、数组作为函数的参数(传递地址)例:对一字符串反序输出。(例:对一字符串反序输出。(例:对一字符串反序输出。(例:对一字符串反序输出。(exinver.c)exinver.c)四、二维数组的声明四、二维数组的声明四、二维数组的声明四、二维数组的声明形式:形式:形式:形式:类型类型类型类型 数组名数组名数组名数组名 常量表达式常量表达式常量表达式常量表达式 常量表达式常量表达式常量表达式常量表达式;如:如:如:如:int scores503;int scores503;说明:说明:说明:说明:编译程序为二维
16、数组分配存储空间时是按行进行的,即先编译程序为二维数组分配存储空间时是按行进行的,即先编译程序为二维数组分配存储空间时是按行进行的,即先编译程序为二维数组分配存储空间时是按行进行的,即先按顺序存放第一行的所有数据,然后接着按顺序存放第二行的所按顺序存放第一行的所有数据,然后接着按顺序存放第二行的所按顺序存放第一行的所有数据,然后接着按顺序存放第二行的所按顺序存放第一行的所有数据,然后接着按顺序存放第二行的所有数据,如此类推。二维数组有数据,如此类推。二维数组有数据,如此类推。二维数组有数据,如此类推。二维数组scoresscoresscoresscores的存储空间分配如下图所示:的存储空间分
17、配如下图所示:的存储空间分配如下图所示:的存储空间分配如下图所示:.25000 scores00 25002 scores01 25004 scores02 25006 scores10 25008 scores11 25010 scores12 .25298 scores492 .五、二维数组元素的引用与初始化五、二维数组元素的引用与初始化引用形式:引用形式:数组名数组名行下标行下标列下标列下标/下标为整数类型的表达式下标为整数类型的表达式如:如:scores201=100;初始化形式:存储类别初始化形式:存储类别 数据类型数据类型 数组名数组名常量常量1常量常量2=初值初值;如:如:sta
18、tic int s34=50,60,80,20,40,90,70,100,10;例例 矩阵行列互换。矩阵行列互换。Exmatrix.c 1 2 3 4 1 5 9 5 6 7 8 2 6 10 9 10 11 12 3 7 11 4 8 12 六、指针与数组六、指针与数组在语言中,指针与数组之间的关系是十分密切的。指针类型变量可在语言中,指针与数组之间的关系是十分密切的。指针类型变量可以当作数组使用,数组类型变量也可以当作指针使用,即在语以当作数组使用,数组类型变量也可以当作指针使用,即在语言中,我们可以象访问指针一样访问数组,也可以象访问数组一样访言中,我们可以象访问指针一样访问数组,也可以
19、象访问数组一样访言中,我们可以象访问指针一样访问数组,也可以象访问数组一样访言中,我们可以象访问指针一样访问数组,也可以象访问数组一样访问指针。其区别为:数组名不能自加、自减,但指针变量可以。问指针。其区别为:数组名不能自加、自减,但指针变量可以。问指针。其区别为:数组名不能自加、自减,但指针变量可以。问指针。其区别为:数组名不能自加、自减,但指针变量可以。例如:例如:例如:例如:int a10,*p;int a10,*p;p=a;p=a;p+p+或或或或p-p-都是成立的,而都是成立的,而都是成立的,而都是成立的,而a+a+或或或或a-a-是不成立的。是不成立的。是不成立的。是不成立的。而而
20、而而*(a+I)a+I)、aIaI、*(p+I)*(p+I)、pIpI是等价的。是等价的。是等价的。是等价的。七、指针数组与数组指针七、指针数组与数组指针七、指针数组与数组指针七、指针数组与数组指针指针数组:指针数组:指针数组:指针数组:指基类型为指针类型的数组,即该数组的每个元素均为一指基类型为指针类型的数组,即该数组的每个元素均为一指基类型为指针类型的数组,即该数组的每个元素均为一指基类型为指针类型的数组,即该数组的每个元素均为一个指针。如果我们需要保留许多指针的值,也就是要保存多个变量的个指针。如果我们需要保留许多指针的值,也就是要保存多个变量的个指针。如果我们需要保留许多指针的值,也就
21、是要保存多个变量的个指针。如果我们需要保留许多指针的值,也就是要保存多个变量的地址,就可以使用指针数组。地址,就可以使用指针数组。地址,就可以使用指针数组。地址,就可以使用指针数组。定义形式:数据类型定义形式:数据类型定义形式:数据类型定义形式:数据类型 *数组名数组名数组名数组名 数组长度数组长度数组长度数组长度;如:如:如:如:int *p10;int *p10;/在此声明了一个包含在此声明了一个包含在此声明了一个包含在此声明了一个包含1010个整数类型指针变量的数组个整数类型指针变量的数组个整数类型指针变量的数组个整数类型指针变量的数组p p。这里这里这里这里*并不是数组名字的组成部分,
22、它只是告诉编译程序并不是数组名字的组成部分,它只是告诉编译程序并不是数组名字的组成部分,它只是告诉编译程序并不是数组名字的组成部分,它只是告诉编译程序p p是一个整是一个整是一个整是一个整数类型的指针数组,而不是简单的整数类型数组数类型的指针数组,而不是简单的整数类型数组数类型的指针数组,而不是简单的整数类型数组数类型的指针数组,而不是简单的整数类型数组。例:建立如下距阵并输出例:建立如下距阵并输出例:建立如下距阵并输出例:建立如下距阵并输出 1 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0
23、1 0 1 0 0 0 1 1 0 0 0 1程序为:程序为:程序为:程序为:main()main()main()main()int a55=0,*p5,i,j;int a55=0,*p5,i,j;int a55=0,*p5,i,j;int a55=0,*p5,i,j;for(i=0;i5;i+)for(i=0;i5;i+)for(i=0;i5;i+)for(i=0;i5;i+)pi=&ai0;/pi=&ai0;/pi=&ai0;/pi=&ai0;/指针数组指针数组指针数组指针数组p p p p 指向指向指向指向a a a a数组的每行起始地址数组的每行起始地址数组的每行起始地址数组的每行起始
24、地址for(i=0;i5;i+)for(i=0;i5;i+)for(i=0;i5;i+)for(i=0;i5;i+)*(pi+i)=1;/*(pi+i)=1;/*(pi+i)=1;/*(pi+i)=1;/对主对角线赋值对主对角线赋值对主对角线赋值对主对角线赋值 *(pi+4-i)=1;/*(pi+4-i)=1;/*(pi+4-i)=1;/*(pi+4-i)=1;/对副对角线赋值对副对角线赋值对副对角线赋值对副对角线赋值 for(i=0;i5;i+)/for(i=0;i5;i+)/for(i=0;i5;i+)/for(i=0;i5;i+)/用二层循环打印二维数组用二层循环打印二维数组用二层循环打
25、印二维数组用二层循环打印二维数组 for(j=0;j5;j+)for(j=0;j5;j+)for(j=0;j5;j+)for(j=0;j5;j+)printf(“%2d”,*(pi+j);/printf(“%2d”,*(pi+j);/printf(“%2d”,*(pi+j);/printf(“%2d”,*(pi+j);/每个指针数组指向每列的表示每个指针数组指向每列的表示每个指针数组指向每列的表示每个指针数组指向每列的表示 printf(n);printf(n);printf(n);printf(n);数组指针:数组指针:数组指针:数组指针:定义形式:数据类型定义形式:数据类型定义形式:数据类
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CC程序设计 程序设计 06 复合 数据类型
限制150内