




已阅读5页,还剩103页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章数组,C/C+语言程序设计,龚尚福,贾澎涛主编C/C+语言程序设计西安电子科技大学出版社,第4章数组,4.1一维数组4.2二维数组4.3字符数组与字符串4.4指针与数组4.5指向指针的指针4.6小结,第4章数组,一个人N门课的成绩怎样存储和处理?一个班N门课的成绩怎样存储和处理?.,这些数据的特点:具有相同的数据类型。为了方便地使用这些数据,C语言提供了一种构造数据类型:数组。数组是个多值变量,由一组同名但不同下标的元素构成。一个数组被顺序存放在一块连续的内存中,用数组名和下标就可以唯一地确定某个数组元素。只有一个下标的数组被称为一维数组,有两个下标的数组被称为二维数组,以此类推。C语言允许使用任意维数的数组。,4.1一维数组,“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“整型常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量,但不能包含变量。例如:floatx10;数组名表示数组第一个元素x0的地址,也就是整个数组的首地址,是一个地址常量。,4.1.1一维数组的定义,数据类型数组名整型常量表达式;,数组定义中应注意以下几个常见错误:(1)“intx;”数组名后面的方括号中内容不能为空,必须为整型常量表达式。(2)“intx(5);”数组名后应该为方括号。(3)“intn=4;intxn;”方括号中不能是变量,必须是常量。以下数组定义是正确的:#defineN10floatscore1N,score2N;intnum10+N;charc26;,4.1.1一维数组的定义(续),数组在内存的存放,数组元素的下标从0开始按顺序编号。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址,即score的值与score0的地址值相同。,score数组,例如:floatscore5;,7,4.1.2一维数组的引用,格式:,例如:输入学生成绩for(i=0;i5;i+)scanf(%f,下标表达式可以为任何非负整型表达式,包括整型常量、整型变量、含有运算符的整型表达式,以及返回值为整数的函数调用。如果值为小数时,C编译将自动取整。下标表达式的值应在元素编号的取值范围内。,数组名下标表达式,8,4.1.2一维数组的引用(续),说明:(1)由于数组元素与同一类型的简单变量具有相同的地位和作用,因此,对变量的任何操作都适用于数组元素。(2)在引用数组元素时,下标可以是整型常数或表达式,表达式内允许变量存在。若定义“intx5;”,设i=3,下列引用都是正确的:,xi/*引用数组x的第3个元素*/xi+/*引用数组x的第3个元素*/x2*i-6/*引用数组x的第0个元素*/,4.1.2一维数组的引用(续),说明:(3)下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:inta10;scanf(%d,/*下标越界*/,C编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。,4.1.2一维数组的引用(续),说明:(4)在C语言中,一般需逐个地使用下标变量引用数组元素。例如,输出有10个元素的整型数组,须使用循环语句逐个输出各下标变量:inta10;for(i=0;i10;i+)printf(%d,ai);而不能用一个语句输出整个数组,下面的写法是错误的:printf(%d,a);,11,4.1.2一维数组的引用(续),(5)是下标运算符,引用数组元素时,根据数组的首地址和下标数,计算出该元素的实际地址,取出该地址的内容进行操作。,如引用score2:(1)计算2000+2*4=2008(2)取出2008的内容,12,4.1.3一维数组元素的初始化,初始化:在定义数组时给数组元素赋初值。,(1)在定义数组时,对全部数组元素赋初值。例如:intx5=1,2,3,4,5;此时可以省略数组长度,例如:intx=1,2,3,4,5;(2)在定义数组时,对部分数组元素赋初值。例如:intx5=1,2,3;只给前面三个元素赋初值(x0=1,x1=2,x2=3),为其余元素赋0。(3)当初值的个数多于数组元素的个数时,编译出错。例如:intx5=1,2,3,4,5,6;,数据类型数组名整型常量表达式=常量表达式,常量表达式,,4.1.4一维数组应用举例,【例4.2】数组赋值与数组拷贝。#includestdio.hvoidmain()inta10,b10,i;for(i=0;i10;i+)ai=i+1;for(i=0;i10;i+)bi=ai;for(i=0;imax则:max=ai;k=i;否则判断:若aimin则:min=ai;j=i;当所有的数都比较完之后,将aj=max;ak=min;输出a数组。,main()inta5,max,min,i,j,k;for(i=0;imax)max=ai;k=i;aj=max;ak=min;for(i=0;i5;i+)printf(%5d,ai);printf(n);,程序运行情况如下:5723151237,16,【例4.4】冒泡法排序(从小到大)。,以6个数:3、7、5、6、8、0为例。第一趟排序情况如下:375680第一次3和7比较,不交换375680第二次7和5比较,交换357680第三次7和6比较,交换356780第四次7和8比较,不交换356780第五次8和0比较,交换356708在第一趟排序中,6个数比较了5次,把6个数中的最大数8排在最后。,17,冒泡法排序(续),第二趟排序情况如下:356708第一次3和5比较,不交换356708第二次5和6比较,不交换356708第三次6和7比较,不交换356708第四次7和0比较,交换356078在第二趟排序中,最大数8不用参加比较,其余的5个数比较了4次,把其中的最大数7排在最后,排出78。以此类推:第三趟比较3次,排出678第四趟比较2次,排出5678第五趟比较1次,排出35678最后还剩下1个数0,不需再比较,得到排序结果:035678,18,冒泡法排序(续),从上述过程可以看到:n个数要比较n-1趟,而在第j趟比较中,要进行n-j次两两比较。,19,程序运行情况如下:375680035678,#defineN6main()intaN;inti,j,t;for(i=0;iai+1)/*前后两数比较、交换*/t=ai;ai=ai+1;ai+1=t;printf(Thesortednumbers:n);for(i=0;iN;i+)printf(%dt,ai);,20,以6个数:3、7、5、6、8、0为例。思路:第一趟:将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;。,【例4.5】比较法排序(从小到大)。,21,【例4.5】比较法排序(续),22,程序运行情况如下:9678658640Thesortednumbers:4065788696,#defineN5main()intaN;inti,j,t;for(i=0;iai)t=aj;aj=ai;ai=t;printf(Thesortednumbers:n);for(i=0;iN;i+)printf(“%dt”,ai);,23,4.2二维数组,“整型常量表达式1”:规定了二维数组中一维数组的个数。“整型常量表达式2”:规定了一维数组中元素的个数。例如:floatx23;,4.2.1二维数组的定义,inta3,4,b(3,4),c,d(3)(4);,数据类型数组名整型常量表达式1整型常量表达式2;,24,地址值数组元素,与一维数组相同,其下标只能是正整数,并且从0开始编号的。,二维数组元素在内存中的排列顺序:按行存放,25,x0是数组名,是元素x00的地址,x1是数组名,是元素x10的地址,x0-x00,x01,x02,x1-x10,x11,x12,可以把x数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素的一维数组。,必须强调的是,二维数组x中的x0、x1、x2是数组名,不是一个单纯的数组元素,不能当作普通变量使用。,二维数组可看作是一种特殊的一维数组,26,a34=3;/*下标越界*/a1,2=1;/*应写成a12=1;*/,4.2.2二维数组的引用,下标表达式是结果为任意非负整型表达式,每个下标都从0开始。例:inta34;a00=3;a01=a00+10;,数组元素的表示形式:,数组名行下标表达式列下标表达式,27,4.2.2二维数组的引用,注意:数组元素和数组定义在形式中有些相似,但这两者具有完全不同的含义。数组定义语句的方括号中给出的是某一维的长度,即某一维元素的个数;数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量、变量或表达式。,28,4.2.3二维数组元素的初始化,例:inta23=1,2,3,4,5,6;,1按行赋初值,将每一行元素的初值用一对花括号括起来。,例:inta23=1,2,3,4,5,6;初始化后结果:123456,2根据该数组元素个数,把初始化数据全部括在一个花括号内,由二维数组按行存储的规则,依次赋给数组对应的元素。,29,4.2.3二维数组元素的初始化,3给部分元素赋初值,例:inta23=1,4;初始化后结果:100400,4数组初始化时,行长度可省,列长度不能省例如:inta3=1,2,3,4,5,6,7;intb4=1,4,5;初始化结果:,a结果:a0:123a1:456a2:700,b结果:b0:1000b1:4500,30,下面对二维数组的定义都是错误的:,4.2.3二维数组的初始化(续),floatx3=1.0,2.0,3.0,4.0,5.0,6.0;,inta,b2,c3;,intm24=1,2,3,4,5,6,7,8,9;/*编译出错,初值个数多于数组元素的个数*/,31,4.2.4二维数组应用举例,【例4.6】建立一个2行3列的整数矩阵,求它的转置矩阵并输出。分析:二维数组的输入、输出要用二重循环语句,外循环变量兼做数组元素的行下标,内循环变量兼做数组元素的列下标。矩阵的转置运算就是将二维数组行和列元素互换,一个2行3列的整数矩阵转置后,得到一个3行2列的整数矩阵。#includevoidmain()staticinta23=1,2,3,4,5,6;staticintb32,i,j;,32,4.2.4二维数组应用举例,printf(arraya:n);for(i=0;i=1;i+)/*将a数组中的第i行第j列元素赋值给b数组的第j行第i列*/for(j=0;j=2;j+)printf(%4d,aij);bji=aij;printf(n);,33,4.2.4二维数组应用举例,printf(arrayb:n);for(i=0;i=2;i+)/*b数组为转置后的数组,输出b数组元素的值*/for(j=0;j=1;j+)printf(%4d,bij);printf(n);,程序运行情况如下:arraya:123456arrayb:142536,34,4.2.4二维数组应用举例(续),【例4.7】有一个NM矩阵,编程序求出其中绝对值最大的那个元素的值及其所在的行、列位置。,图4.4查找最大元素,35,#includemath.h#defineN4#defineM5main()inti,j,row,colum,max,aNM;/*输入数据*/max=a00;row=colum=0;for(i=0;imax)max=abs(aij);row=i;colum=j;/*输出数据*/,程序运行情况如下:3456126723126743985465456616243783256419max=98,row=1,colum=3,36,4.3字符数组与字符串,4.3.1字符数组的定义与操作,不是字符串,是字符串,字符数组:存放字符数据的数组,称为字符数组,每一个元素存放一个字符。字符串:字符串的末尾必须有0字符,它的ASCII码值为0。,37,例如:chara35;a数组是一个二维的字符数组,可以存放15个字符或3个长度不大于4的字符串。,4.3.1字符数组的定义与操作,例如:chars10;s数组是一维字符数组,它可以存放10个字符或一个长度不大于9的字符串。,一维字符数组的定义格式:,二维字符数组的定义格式:,char数组名整型常量表达式;,char数组名整型常量表达式1整型常量表达式2;,38,字符数组的初始化,1字符数组也允许在定义时作初始化赋值,通常方式是逐个字符赋给数组中各元素。例如:charc5=C,h,i,n,a;,再例如:charc6=C,h,i,n,a,0;,是字符串,不是字符串,39,字符数组的初始化(续),例如:charc10=p,r,o,g,r,a,m;把10个字符分别赋给c0到c9的10个元素。,2如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动赋值为空字符(0)。,如果给出的字符个数大于数组长度,则出现语法错误。,40,字符数组的初始化(续),3初始化时长度的省略,如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。,例如:chars2=s,t,r,i,n,g;,数组的长度定义为6。,41,字符数组的引用,字符数组中的每个元素相当于一个字符变量,因此对一个数组元素的引用就是对一个字符变量的引用。可以给一个数组元素赋一个字符,也可以得到该数组元素中存放的字符。例如:charc=p,r,o,g,r,a,m;c5=p;将数组元素c5的值由a改为p。,42,字符数组的引用,字符数组除了在定义时可以对其整体赋值外,其他地方不能对其整体赋值,只能一个元素一个元素地赋值。例如:charc5;c=A,B,C;/*错误*/c0=A;c1=B;c2=C;/*正确*/,43,在计算机应用中,除了要处理大量的数值型数据外,还不可避免的要处理大量的文字信息。通常文字在计算机中是用字符串来表示的。1.字符串常量用双引号括起来的一串字符就是字符串常量,它的末尾将由系统自动加一个字符串结束标志0。例如:字符串常量“program”中共有7个字符,串的长度就是7。但它在内存中要占8个字节的存储单元,最后一个字节存储0。,4.3.2字符串,44,2.字符数组与字符串的区别字符数组中的每个元素都可以存放任意的字符,并不要求最后一个字符必须是0。字符串,必须以0结束。,4.3.2字符串,C语言中,没有专门的字符串变量,通常用一个字符数组来存放一个字符串常量。,一个字符型一维数组中的内容能否作为字符串使用,关键是看数组有效字符后面是否加入了串结束符0。,45,3.通过赋初值为字符数组赋字符串(1)所赋初值个数少于元素个数时,系统自动加0。例如:charc10=p,r,o,g,r,a,m;若定义成:charc7=p,r,o,g,r,a,m;则数组c不能作为字符串使用,只能作为一维数组使用。因为数组中没有存放串结束标志的空间了。,4.3.2字符串,46,(2)若采用单个字符赋初值来决定数组大小的定义形式,一定要人为加入0。例如:charc=p,r,o,g,r,a,m,0;这时系统为数组c开辟8个存储单元。但若定义成:charc=p,r,o,g,r,a,m;则系统只为数组c开辟7个存储单元,没有存放0的存储空间,c也不能作为字符串使用。,4.3.2字符串,47,(3)可以在定义时直接赋字符串常量,这时不用人为加入0,但必须有存放0的空间。例如:charstr115=“Iamhappy”;也可以省略花括弧,直接写成:charstr115=Iamhappy;还可以省略数组长度。写成:charstr2=Iamhappy;因为系统自动为字符串常量添加串结束标志0,所以字符数组str2占用10+1=11个内存单元。,4.3.2字符串,48,4.3.2字符串,4字符串的输入和输出由于字符串是存放在字符数组中的,所以字符串的输入和输出实际上就是字符数组的输入和输出。对字符数组的输入和输出可以有两种方式:(1)采用“%c”格式符,每次输入或输出一个字符。charc10=I,a,m,h,a,p,p,y;inti;for(i=0;i0,strcmp(str1,str2)str2,思考:若有语句if(s1=s2)printf(s1=s2);比较的是什么?,60,4求字符串长度函数strlen(),调用格式:功能:测试字符串长度。函数值就是str中字符的个数。,思考:字符串China和str数组在内存中各占几个字节?,输出结果:5,例如:charstr10=China;printf(%d,strlen(str);或printf(%d,strlen(China);,strlen(str),61,5.大写字母转换成小写字母函数strlwr(),调用格式:功能:将str字符串中的大写字母转换成小写字母。,输出结果:microsoftword,输出结果:abcd,例如:charstr=MICROSOFTWORD;strlwr(str);puts(str);,例如:printf(%s,strlwr(AbCd);,strlwr(str),62,6.小写字母转换成大写字母函数strupr(),调用格式:功能:将str字符串中的小写字母转换成大写字母。,输出结果:PASCAL,例如:charch10=pascal;printf(%s,strupr(ch);,strupr(str),63,4.3.4字符串数组,程序设计中经常要用到字符串数组。可用二维字符数组的形式建立字符串数组,行下标决定字符串的个数,列下标决定串的最大长度。例如:charstr_array3080;定义了一个字符串数组,它可存放30个字符串,串的最大长度为80个字符。要访问单独的字符串,只需标明行下标就可以了。例如:gets(str_array2);该语句在功能上等价于:gets(,64,(1)指针与整数的加减运算指针变量加上或减去一个整数n,是指针由当前所指向的位置向前或向后移动n个数据的位置。通常这种运算用于指针指向一个数组中。由于各种类型的数据的存储长度不同,因此在数组中加减运算使指针移动n个数据后的实际地址与数据类型有关。对指针p进行n操作后的实际地址值是:pn*sizeof(数据类型)。,4.4指针与数组,4.4.1指针运算,1.算术运算,65,(2)自增自减运算指针变量自增、自减运算也是地址运算,指针加1运算后指针指向下一个数据,指针减1运算后,指针指向上一个数据的起始位置。(3)两个指针相减运算两个指针相减的运算只能在同一种指针类型中进行,它们主要应用于对数组的操作,其结果是一个整数而不是指针。例如:p1和p2是指向同一数组中不同或相同元素的指针(p1小于或等于p2),则p2-p1的结果为p1和p2之间间隔元素的数目n。,4.4指针与数组,4.4.1指针运算,66,指针的关系运算表示它们所指向的地址之间的关系。两个指针应指向同一个数组中的元素,否则运算结果无意义。指针间允许4种关系运算:比较两指针所指向的地址的大、小关系。=或!=判断两指针是否指向同一地址,即是否指向同一数据。,4.4指针与数组,4.4.1指针运算,2.关系运算,67,例如,指针p1,p2指向数组中的第i、j元素,则下列表达式为真的含义为:(1)p1p2)。表示p1所指元素位于p2所指元素之前(或表示p1所指元素位于p2所指元素之后)。(2)p1=p2(或p1!=p2)。表示p1和p2指向同一个数组元素的地址(或表示p1和p2不指向同一个数组元素的地址)。用于判断指针p是否为NULL指针。,4.4指针与数组,4.4.1指针运算,2.关系运算,68,指针不能与一般数值进行关系运算,但指针可以和零(NULL字符)之间进行等于或不等于的关系运算,如:p=0;p!=0;或p=NULL;p!=NULL;,4.4指针与数组,4.4.1指针运算,2.关系运算,69,数组名是个不占内存的地址常量,它代表整个数组的存储首地址。a是数组的首地址(即a0的地址)。a=,70,4.4指针与数组,4.4.2指向一维数组的指针,2.一维数组指针的定义,由于数组元素也是一个内存变量,所以此类指针变量的定义和使用与指向变量的指针变量相同。例如:inta10,*p;p=a;(或p=/*指针的初始化*/,a,71,对于指向一维数组的指针p,它所指向的变量(即*p)的数据类型必须与这个一维数组的数组元素类型一致。例如,下面语句是错误的:floata30;int*p=/*指向整型的指针不能指向数组元素类型为单精度的一维数组*/,4.4指针与数组,4.4.2指向一维数组的指针,2.一维数组指针的定义,72,如果指针变量p指向数组a的第1个元素(即0号元素),即p=a,则可以用p表示数组元素下标法:p0,p1,pi,p9指针法:*(p+0),*(p+1),*(p+i),*(p+9),4.4指针与数组,4.4.2指向一维数组的指针,3.利用指针引用一维数组元素,73,指针变量可以通过本身值的改变,实现对不同地址的操作,即可以使用p+。数组名表示数组的起始地址,所以数组名也可以称为指针,但是数组名是一个特殊的指针,它是指针常量,其值在程序整个运行过程中都不能被改变,只代表数组的起始地址。所以,如果a是一个数组名,像“a+”或者“a=a+2”这些语句都是错误的。,4.4指针与数组,4.4.2指向一维数组的指针,3.利用指针引用一维数组元素,74,【例4.10】分别用下标法和指针法输出数组。#includevoidmain()inti,*p,a5;p=a;for(i=0;i5;i+)ai=i+10;printf(n);,4.4指针与数组,4.4.2指向一维数组的指针,75,for(i=0;i5;i+)printf(a%d=%d,i,ai);/*下标法*/printf(t*(p+%d)=%d,i,*(p+i);/*指针法*/printf(tp%d=%d,i,pi);/*下标法*/printf(t*(a+%d)=%dn,i,*(a+i);/*指针法*/,4.4指针与数组,4.4.2指向一维数组的指针,程序运行结果为:a0=10*(p+0)=10p0=10*(a+0)=10a1=11*(p+1)=11p1=11*(a+1)=11a2=12*(p+2)=12p2=12*(a+2)=12a3=13*(p+3)=13p3=13*(a+3)=13a4=14*(p+4)=14p4=14*(a+4)=14,76,在利用指针来引用数组元素时应注意以下几点:(1)通过指针访问数组元素时,必须首先让该指针指向当前数组,还需要使用和掌握指针在数组中的几种运算方式。,4.4指针与数组,4.4.2指向一维数组的指针,77,(2)使用指针引用数组元素时下标不能越界。例如:inta5;int*p,n;p=a;利用p=p+n移动指针使指针p指向数组a的任意一个元素,当n等于0、1、2、3、4时,指针p将分别指向数组a的第0、1、2、3、4个元素。但对于n大于4时也是合法的语句,这时指针p指向数组a后面的存储单元。在C语言中指针变量可以指向数组范围之外的存储单元,编译系统不对数组元素引用下标越界进行判断,因为编译系统将数组元素引用处理成对数组起始地址加上数组元素的相对位移量所得的指针指向的存储单元的引用,所以在使用指针引用数组元素时应注意下标不能越界。,4.4指针与数组,4.4.2指向一维数组的指针,78,【例4.11】从键盘输入10个数,利用指针法输入输出数组。#includevoidmain()inti,*p,a10;p=a;for(i=0;i10;i+)scanf(%d,p+);printf(“n”);p=a;/*指针变量重新指向数组首地址*/,4.4指针与数组,4.4.2指向一维数组的指针,10,79,for(i=0;i10;i+)printf(a%d=%dn,i,*p+);/*指针法*/*还可以这样写:for(p=a;pa+10;p+)printf(a%d=%dn,i,*p);*/*或:for(p=a;pa+10;)printf(a%d=%dn,i,*p+);*/,4.4指针与数组,4.4.2指向一维数组的指针,10,80,例如:inta34;(1)二维数组名a和int*p,*q;p=a0;/*指针p指向数组元素a00*/q=,这种指针变量的定义及使用与指向一维数组元素的指针变量是相同的,用它存放二维数组元素的地址。,86,4.4指针与数组,4.4.3指向二维数组的指针,2.指向二维数组元素的指针变量,【例4.13】利用指针变量及指针变量的加法运算输出二维数组所有元素的值。#includestdio.hvoidmain()inta33=0,1,2,3,4,5,6,7,8;int*p,i,j;p=,87,一个二维数组相当于多个一维数组。通过指向整个一维数组的指针变量,也可以完成二维数组数据的操作处理。定义一个指向由n个元素组成的一维数组指针变量的一般形式为:,4.4指针与数组,4.4.3指向二维数组的指针,3.指向由n个元素组成的一维数组的指针变量,“*”:表示其后的变量名为指针类型。“整型常量”:表示目标变量是一维数组,并说明一维数组元素的个数。“*变量名”:表示指针变量的名称。“数据类型”:是定义一维数组元素的类型。,数据类型(*变量名)整型常量,88,例如:int(*p)4;该语句表示定义一个指向由4个整型数组元素组成的一维数组的指针变量p,指针变量p存储该一维数组的起始地址。当指针进行加1运算时,就可以移动到该数组的下一行。,4.4指针与数组,4.4.3指向二维数组的指针,3.指向由n个元素组成的一维数组的指针变量,89,注意:(1)在指向一维数组的指针变量定义中,应注意不能把其中的圆括号去掉。例如:去掉圆括号就变成了如下的形式:int*p4;由于的优先级高于*的优先级,所以变量名将与结合,说明变量名为数组名,该数组的元素类型为指针类型。,4.4指针与数组,4.4.3指向二维数组的指针,3.指向由n个元素组成的一维数组的指针变量,90,(2)指向整个一维数组的指针变量不能指向数组元素,所以指向数组元素的指针与指向一维数组的指针所指向对象的类型不同,在使用时有很大的区别。如果有:inta33=0,1,2,3,4,5,6,7,8;int(*p)3;则下面语句是错误的:p=a0;或者p=虽然a0和int(*p)10;p=a;/*错误*/这时,指针p就不能指向数组a,因为指针p要求指向一维数组的长度为10,而二维数组a的每一行中只包含3个元素,即列的长度为3。,4.4指针与数组,4.4.3指向二维数组的指针,3.指向由n个元素组成的一维数组的指针变量,92,【例4.14】用指向一维数组的指针变量输出数组元素。main()inta34=0,1,2,3,10,11,12,13,20,21,22,23;int(*lp)4,i,j;for(lp=a,i=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(*(lp+i)+j);printf(n);,4.4指针与数组,4.4.3指向二维数组的指针,程序运行结果为:01231011121320212223,93,4.4指针与数组,4.4.4指针与字符串,指向字符串首地址的指针变量称作字符串指针,它实际上是字符类型的指针。其定义的一般形式为:,字符串的两种表示方式:字符数组表示方式,字符串存放在一维数组中,引用时用数组名。字符指针变量表示方式,字符指针变量存放字符串的首地址,引用时用指针变量名。,char*变量名;,94,4.4指针与数组,4.4.4指针与字符串,利用一个字符串指针访问字符串通常可以采用以下两种方式。(1)将一个字符数组的起始地址赋值给指针变量。例如:char*p;chars=abc;p=s;字符串“abc”存储在字符数组s中,数组s的起始地址赋值给指针变量p,则指针p就指向字符串“abc”。,95,4.4指针与数组,4.4.4指针与字符串,(2)将一个字符串常量赋值给指针变量。例如:char*p;p=abc;上述语句运行结果并非使指针变量p的内容变成了字符串“abc”。字符串常量“abc”赋值给指针p的结果是将存储字符串常量的起始地址赋值给指针p。这样指针p就指向了字符串常量“abc”。,96,4.4指针与数组,4.4.4指针与字符串,字符数组和字符指针变量都可实现对字符串的存储和操作,但是两者是有区别的。(1)字符数组占用若干个字节,每一个字节存放一个字符。而字符指针变量本身是一个变量,用于存放字符串的首地址,占用4个字节。字符串本身存放在以该首地址为首的一块连续的内存空间中,并以0作为串的结束。,97,4.4指针与数组,4.4.4指针与字符串,(2)赋值方式不同。字符串赋给字符数组只能在初始化时进行,如:charstring15=CLanguage;而不能出现下面的情况:charstring15;string=CLanguage;对字符指针变量则无此限制,如:char*ps=CLanguage;等价于:char*ps;ps=CLanguage;,98,【例4.15】用字符指针处理字符串。#includevoidmain()char*str=IloveChina!,*str1;inti;str1=str;printf(%sn,str);for(;*str!=0;)printf(%cn,*str+);printf(n);str1+=7;printf(%sn,str1);,4.4指针与数组,4.4.4指针与字符串,程序运行结果为:IloveChina!IloveChina!China!,99,指针数组定义的一般形式:由于“”比“*”的优先级高,所以数组名先与“整型常量表达式”结合,形成数组的定义形式。“*”表示数组中每个元素是指针类型“数据类型”说明指针的目标变量的数据类型。例如:int*ip10;char*cp5;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于PBL与赛教融合模式的市场营销案例教学研究
- 《上下前后左右》课件
- 澳洲合租合同(标准版)
- DMTr-TNA-A-Bz-amidite-生命科学试剂-MCE
- Dethia-CoA-Desulfocoenzyme-A-生命科学试剂-MCE
- 核心业务数据不一致应急预案
- 公司内部培训计划课件
- 经果林开挖合同(标准版)
- 2025年护理核心制度培训考试试题及答案
- 2025年康复医学技士高级职称考试题(附答案)
- DB43∕T 2638-2023 文物建筑属性数据采集技术规范
- 初中语文整本书阅读教学策略探究
- 年产5.2GW光伏组件项目环评报告表
- DB42T 1049-2015 房产测绘技术规程
- 基于Spring Boot的服装店铺管理系统论文
- 城市之星活动方案
- PLC基础知识入门课件
- 企业统借统还管理制度
- 蜂窝无源物联网标签技术白皮书
- 招聘中的大数据分析与精准匹配
- 盆底重建术并发症
评论
0/150
提交评论