数组字符串和指针.ppt
第5章 数组、字符串和指针,数组字符串指针链表,数组,一维数组二维数组和多维数组,数组,数组是有序数据的集合。数组中每一个元素都属于同一个数据类型,并且具有相同的名字。为了区分一个数组中的不同元素,可以用数组名和下标的组合来惟一确定数组的一个元素。数组分为一维数组和多维数组,二维数组是一种最简单也是最常用的多维数组,一维数组,一维数组的定义方式为:数据类型 数组名数组长度;一个数组的每个元素都可以通过数组名和下标组合的方式进行访问。具体访问形式如下:数组名下标元素的下标是从0开始的整数,使用一维数组,求10个数的平均值,并找出其中的最大值和最小值,用冒泡法对10个数进行从小到大的排序,二维数组,二维数组的定义方式为:数据类型 数组名常量表达式常量表达式int a34;,使用二维数组保存3个学生4门课成绩,求出每门课平均成绩和每名学生的平均成绩,多维数组,多维数组中最简单也是最常用的一种数组是二维数组,也可以定义三维或者三维以上的数组。数据类型 数组名常量表达式常量表达式.常量表达式;,字符串,字符数组和字符串标准字符串库函数字符串数组,字 符 串,在C+中,没有字符串数据类型,所有的字符串都是作为字符数组来处理的。所谓字符数组,就是一个一维数组,数组中每个元素都是char数据类型。,字符串定义,char c10;char c10=b,e,i,j,i,n,g;,字符数组来表示字符串,C+要求在字符串的末尾增加一个字符的空间用于保存一个字符串结束标记0。要用字符数组来保存字符串时,要定义一个一维字符数组,让这个字符数组的长度比要保存的字符串的字符数目多1个,这样就有足够的空间保存字符串中的所有有效字符和字符串结束标记0,字符串输入函数gets,gets和cin的区别gets函数要求有一个参数,这个参数用于保存已经输入的字符串。char str80;gets(str);,字符串输出函数puts,带有一个参数用于保存需要输出的字符串char str80=hello world!;puts(str);,字符串长度函数strlen,求一个字符串的长度char str80=Hello World!;coutstrlen(str);,字符串复制函数strcpy,把一个字符串的内容赋值给另一个字符串char str180=hello;char str280;strcpy(str2,str1);strcpy(str2,str1,2);,字符串比较函数strcmp,字符串之间比较的规则是:两个字符串从左至右逐个字符比较,直到遇到不同的字符或者遇到字符串结束标志为止。如果两个字符串完全相同,那么就认为相等;如果不同,那么第一个不同的字符相比较的结果就是字符串比较的结果。if(strcmp(str1,str2)=0)coutstr1等于str2;,字符串连接函数strcat,将两个字符串连接成一个字符串char str130=Hello;char str2=World!;coutstrcat(str1,str2);,指针,指针的定义使用简单的指针指针和数组指针和字符串,指针数组多重间接访问指针、数组与函数main函数的参数,指针的定义,指针是用于存储地址的对象。如果x是一个指针,它保存了变量y的地址,那么就称x是一个指针变量,x指向y。定义指针变量的方法是:数据类型*指针变量名;其中,“数据类型”表示的是指针变量中用以指向的变量的数据类型。,运算符,“&”和“*”“&”是一个单目运算符,后面跟一个变量,表示取后面变量的地址;“*”也是一个单目运算符,后面跟一个变量,这个变量通常是一个指针变量,表示取这个指针变量所指向变量的值,使用指针,在指针类型中不使用强制类型转换,使用指针运算,指针和数组,一个数组的数组名就是一个指向这个数组中第一个元素的指针。由于数组在内存中保存时使用的是连续的存储空间,因此,数组中每个元素都有自己的地址,并且这些地址是相连的。这样,如果可以得到一个数组中某个元素的地址,又知道这个数组中每个元素的数据类型,那么就可以通过一个指针和在这个指针上进行的算术运算访问到这个数组中的所有元素。可以说访问数组元素的方法有两种一种是使用下标法访问数组元素,一种方法是使用指针法访问数组元素使用指针法访问数组元素的效率要高于下标法。,使用指针访问字符数组,大写字符和小写字符之间相互转换,指针和字符串,在C+中,要访问一个字符串可以采用两种方法使用字符数组;使用指向字符的指针来指向一个字符串,将一个字符串反向输出,指针数组,如果一个数组中所有的元素都是同一种类型的指针,那么这个数组就是一个指针数组int*p10;,创建一个字典,根据输入的字母找到以此字母开头的单词并输出,多重间接访问,如果一个指针中保存的是另一个指针的地址的话,那么这个指针就是一个指向指针的指针,实现的是二次间接访问。间接访问的次数可以无限地增加下去,但是一般情况下,很少有用到三次或者三次以上的间接访问。,使用指向指针的指针,用指向指针的指针处理字符串数组,指针作为函数参数,与函数参数通过传引用方式进行实参到形参的传递类似,指针也可以作为函数的参数并通过指针带回处理的数据。为了让指针作为函数参数,就需要让函数的形参和实参都是指向同样数据类型变量的指针。,用指针作为函数参数求两个数的较大和较小值,数组作为函数参数,如果要让一个数组的元素作为函数的参数,那么使用方法与普通变量做参数没有任何区别。由于一个数组的名字就是指向这个数组第一个元素的指针,因此如果让数组名作为参数,实际上就是让一个特殊的指针作为参数。,计算两个向量的和,指针作为函数返回值,函数也可以返回一个指针。,在一个字符串中删除指定字符,并显示删除后的结果,main函数的参数,在C+中允许main函数带有两个可选的参数、argc是一个int类型的形参。它的作用是保存命令行参数中参数的个数。需要说明的是,argc的值至少是1,原因是文件名也会被认为是一个参数argv是一个字符指针数组,每个元素都是一个字符指针,用于指向命令行中各个参数的第一个字符,使用命令行参数实现显示字符串,编写一个整数加法程序,加数和被加数用命令行参数的方式输入,链表,什么是链表链表的创建、插入和删除,什么是链表,链表由一个或多个节点组成。每个节点可以分成两个部分,一部分用于保存数据,另一部分是一个或多个指针,用于指向这个节点后面或者前面的节点。为了能够找到链表,定义了一个头指针,专门用于存放链表第一个节点的地址。为了能表明一个节点是链表的结尾,这个节点的指向后面节点的指针被赋值成空指针。,链表分类,单向链表双向链表循环链表,表示链表,使用结构体struct nodeint data;struct node*p;,访问成员,定义了指向链表的指针p之后使用“.”操作符*p.data使用指向运算符“-”p-data,链表的创建,向系统申请一个节点所需的内存空间,可以使用new运算符指针变量=new 数据类型;一个节点所用的空间不再需要,那么可以使用delete运算符将这块内存空间交还给系统delete 指针变量;,创建一个链表用于保存若干个整数,插入节点,如果需要把一个新节点插入到链表中间的某个位置,那么相对把新节点放在链表的末尾要复杂一些。例如,要把p指针指向的节点插入到q指针指向的节点后面,可以使用下面的语句:p-next=q-next;q-next=p;,创建一个链表用于保存若干个整数,并按照从小到大的顺序排列,节点的删除,要删除q指针后面的节点p,可以使用下面的语句:q-next=p-next;然后使用delete运算符把p节点删除,语句是delete p;,