《C语言知识梳理》PPT课件.ppt_第1页
《C语言知识梳理》PPT课件.ppt_第2页
《C语言知识梳理》PPT课件.ppt_第3页
《C语言知识梳理》PPT课件.ppt_第4页
《C语言知识梳理》PPT课件.ppt_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

全国计算机国家等级考试 C语言二级培训课件,南华大学计算机学院培训中心 ,一、基础知识,C语言是函数语言,即所有程序均以函数方式出现与调用。,C语言程序中有且只有一个main函数,,C语言中每一条语句结束均以;结束。,C语言是一种编译语言,即将所有源程序编译后才可执行,标识符: 变量名、符号常量名、函数名、类型名、数组名、结构体名以及文件名均为标识符,标识符只能由字母、数字和下划线组成,且第一个字符必须是字母或下画线。 关键字的概念,常量与变量区别,数据类型,整型:int 例:12 012 0x12 short int(2)、int(4) 、long int(4)、 unsigned 12L 78U,实型:4.6 6E-2(十进制小数、指数形式) float(4) 、double(8) 、long double(10),字符型:单引号括起来的一个字每 转义字符 n t v b r ” ddd xhh,字符与字符串的区别,运算符与表达式 算术运算符 + - * / % 关系运算符 = | & 指针运算符 * & 其它运算符 ?: ,类型自动转换,运算符优先级,if语句嵌套:如果if(表达式)或else后面的语句又包含一个或多个if语句,就称为if语句的嵌套。,if语句的两层嵌套结构:,分支结构,if(表达式1) if(表达式1_1) 语句1_1; else 语句1_2;,if else 配对原则:缺省 时,else总是和它上面离它最近的未配对的if配对,switch语句,switch (表达式) case 常量表达式1:语句1; case 常量表达式2:语句2; case 常量表达式n:语句n ; default:语句n+1;,当表达式的值与某一个case后面的常量相等时,执行该case后面的语句。然后执行下一个case后面的语句, 若所有的case后面的常量都不和表达式的值相匹配,就执行default后面的语句。 每一个case的常量表达式必须互不相同,不能表示范围,如x0 。 常量可以是整数或字符,void main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0: a+; break; case 1: b+; break; case 2: a+;b+; break; case 3: a+;b+; printf(“na=%d,b=%d”,a,b); ,运行结果:a=2,b=1,【例】根据程序写出运行结果,Break的应用,课堂练习,根据所输入的年份与月份,计算该有有多少天。,while循环结构 一般形式:,while(表达式) 循环体语句;,执行流程:,循环结构,特点:先判断表达式,后执行循环体 说明: 循环体有可能一次也不执行 循环体可为任意类型语句 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇break,return,goto 无限循环: while(1) 循环体;,do 循环体语句; while(表达式);,dowhile循环结构 一般形式:,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,一般形式:,for(循环变量赋初值;终止条件;循环变量增(减)值) 循环体语句; ,for (表达式1;表达式2;表达式3) 循环体语句; ,for循环结构,执行流程:,循环体的理解,例 判断m是否素数,#include #include main() int m,i,k; scanf(“%d“, ,例 求300360之间素数的个数,#include #include main() int m,n,i,j,k; n=0; for(m=301;m360;m+) k=(int)sqrt(m); i=2; while(m%i!=0 ,break语句 功能:在循环语句和switch语句中,常和if语句一起使用,当满足条件时终止程序并跳出循环体或开关体 说明: break只能终止并跳出最近一层的结构 break不能用于循环语句和switch语句之外的任何其它语句之中,continue语句 功能:跳过循环体中尚未执行的语句,结束本次循环,进行下一次循环体。 仅用于循环语句中,例 求300360,600-680之间素数的个数,#include #include main() int m,n,i,k; n=0; for(m=301;m360,【例1】计算1!+ 3!+ 5!+ + 99!。,【例2】输入一个二进制数,输出其对应的十进制数,【例3】 2/1,3/2,5/3,8/5,/21/13.求该数列的前30项之和,【例4】求1000以内最大的完数。完数就是其真因子的和等于其本身的数。,函数的定义,合法标识符,函数返回值类型 缺省int型 无返回值void,函数体,函 数,函数的返回值 返回语句 形式: return(表达式); 或 return 表达式; 或 return; 功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数 说明: 函数中可有多个return语句 若无return语句,遇时,自动返回调用函数 若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换 void型函数,例 无返回值函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; ,函数说明 对被调用函数要求: 必须是已存在的函数 库函数: #include 用户自定义函数: 函数类型说明 函数说明 一般形式: 函数类型 函数名(形参类型 形参名, ); 或 函数类型 函数名(); 作用:告诉编译系统函数类型、参数个数及类型,以便检验 函数定义与函数说明不同 函数说明位置:程序的数据说明部分(函数内或外) 下列情况下,可不作函数说明 若函数返值是char或int型,系统自动按int型处理 被调用函数定义出现在主调函数之前 有些系统(如Borland C+)要求函数说明指出函数返值类型和形参类型,并且对void 和 int 型函数也要进行函数说明,说明: 实参必须有确定的值 形参必须指定类型 形参与实参类型一致,个数相同 若形参与实参类型不一致,自动按形参类型转换函数调用转换 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放,函数参数及其传递方式 形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,参数传递方式 值传递方式 方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值 特点: 形参与实参占用不同的内存单元 单向传递,地址方式 -方式:函数调用时,为形参接受一个地址,形参与实参共同一个内存单元,对形参的操作可能会影响实参结果; -特点: 形参与实参指向相同的内存单元 相互影响,例:void f(int *p); Main() int a5=1,2,3,4,5,*r=a; f(r);printf(“%dn”,*r); void f(int *p) p=p+3;printf(“%d”,”,*p); 运行结果为:,void fun(int *a,int n) int i,j,k,t; for(i=0;iak)k=j; t=ai;ai=ak;ak=t; main() int aa10=1,2,3,4,5,6,7,i; fun(aa,7); for(i=0;i7;i+)printf(“%d,”,aai); printf(“n”); 结果为:,void ss(char *s,char t) while(*s) if(*s=t)*s=t-a+A; s+; main() char str1100=“abcddfefdbd“,c=d; ss(str1,c); printf(“%sn“,str1); 程序运行后的输出结果是 A)ABCDDEFEDBD B)abcDDfefDbD C)abcAAfefAbA D)Abcddfefdbd,#include #include void fun(char *s,int n) char *t; int i,j; for(i=0;istrlen(sj) t=si;si:sj;sj=t; main() char *ss=“bcc“,“bbcc“,“xy“,“aaaacc“,“aabcc“; fun(ss,5); printf(“%s,%sn“,ss0,ss4); 程序的运行结果是 A)xy,aaaacc B)aaaacc,xy C)bcc,aabcc D)aabcc,bcc,#include #define N 80 int fun(int a, int n) int i,j=1; for(i=1;in;i+) if(aj-1 _ ai) aj+=ai; _ ; ,main() int aN= 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10, i, n=19; printf(“The original data : n“); for(i=0; in; i+)printf(“%3d“,ai); n=fun(a,n); printf(“nThe data after deleted: n“); for(i=0; in; i+)printf(“%3d“,ai); printf(“nn“); ,以下程序的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。 例如,若一维数组中的数据是: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10 删除后,数组中的内容应该是: 2 3 4 5 6 7 8 9 10。,函数的嵌套 嵌套调用 C规定:函数定义不可嵌套,但可以嵌套调用函数,递归调用 定义:函数直接或间接的调用自身叫函数的递归调用,例1 反向输出一个整数,if(n为一位整数) 输出n; else 输出n的个位数字; 对剩余数字组成的新整数重复 “反向输出”操作; ,#include int f(int x) int y; if(x=0|x=1) return(3); y=x*x-f(x-2); return y; main() int z; z=f(3); printf(“%dn“,z); 程序的运行结果是 A)0 B)9 C)6 D)8,int fun(int n) if(n=1)return 1; else return(n+fun(n-1); main() int x; scanf(“%d“,printf(“%dn“,x) 执行程序时,给变量x输入10,程序的输出结果是 A)55 B)54 C)65 D)45,变量的属性 数据类型:变量所持有的数据的性质(操作属性) 存储属性 存储器类型:寄存器、静态存储区、动态存储区 生存期:变量在某一时刻存在-静态变量与动态变量 作用域:变量在某区域内有效-局部变量与全局变量 变量的存储类型 auto -自动型 register-寄存器型 static -静态型,静态存储:程序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间,例 求下列程序的输出结果 #include main() int f(void);/*函数声明*/ int j; for(j=0;j3;j+) printf(“%dn“,f(); int f(void)/*无参函数*/ static int x=1; x+; return x; ,例:static int a=8; 静态局部变量的初始化只在编译时进行一次,每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用结束时的值。若定义但不初始化,则自动赋以“(数值型)或0(字符型)。,全局变量,当变量定义放在函数体外时,该变量就称为全局变量,全局变量也称为外部变量。 对于全局变量分可使用extern和static两种说明符,用static修饰的全局变量称为静态全局变量(静态外部变量)。 全局变量和静态全局变量都属于静态存储类。生存期都是程序的一次执行,定义和初始化都是在程序编译时进行,其初始化只有一次。若没有初始化,则自动赋以“(数值型)或0(字符型)。,例: #include int a=2,b=4; /*a,b为全局变量*/ void f1( ) int t1,t2; t1 = a * 2; t2 = b * 3; b = 100; printf (“t1=%d,t2=%d,b=%dn”, t1, t2,b); main() int b=4; /* 此b是局部变量,赋值 */ f1( ); /* 调用函数f1( ) */ printf (“a=%d,b=%d”, a, b); ,结论:全局变量与局部变量同名时,局部变量起作用,全局变量被屏蔽(不影响),应小心使用,编译预处理,作用:对源程序编译之前做一些处理,生成扩展C源程序 种类 宏定义 #define 文件包含 #include 条件编译 #if-#else-#endif等 格式: “#”开头 占单独书写行 语句尾不加分号,宏替换 1、不带参数宏定义 形式为: #define 宏名 替换文本 如: #define PI 3.14159 /*定义后,可以用PI来代替串3.14159*/ 宏定义的作用:在一个宏定义行之后, 该程序中 宏名就代表了该字符串。 说明: 可以用 #undef命令终止宏定义的作用域。 例如:#undef PI,宏体,宏定义的嵌套使用 双引号内的与宏同名的字母不作宏展开,2、带参数的宏定义 1.带参数的宏定义的一般形式为 # define 宏名(参数表) 字符串 2.带实参的宏名被展开时, 宏名被所定义的宏体替换, 宏体中的形参按从左到右的顺序被实参替换。 3.宏展开时,先展开再计算 例如: #define S (a,b) a*b area = S (3+2,2+5); 则展开后为:area=3+2*2+5 计算结果为:area=12而不是35,3、宏定义与函数的区别 (1) 引用宏只占编译时间,不占运行时间。 (2) 引用宏没有返回值。 (3) 宏替换的形参无类型。 (4) 实参为表达式的情况。 函数调用是先计算出实参的值, 再将值传递给形参;宏的引用是用表达式替换形参.,使用宏替换应注意的问题 (1) 宏名与宏体之间用空格相隔 (2)宏名尽管是字符串,但不能用引号括起来 (3)在宏定义中结尾不能有分号” ; ” (4) 宏定义中的参数尽量用圆括号括起来以免错误 (5)宏定义可以写在程序中的任何地方,但因其作用域为从定义之处到文件未尾,所以一定要写在程序引用该宏之前,通常写在一个文件之首,一 维 数 组,一维数组的定义: 只有一个下标的数组。 定义格式 : 类型标识符 数组名元素个数; 在C 语言中,数组必须显示地说明,以便编译程序为它们分配内存空间。不能用变量表示元素个数,注意: 1、数组“元素个数”即数组长度,只能是一个整型常量表达式或整型符号常量表达式。 2、下标是数组元素在数组中的顺序号,从0开始。 3、下标只能是有序类型的数据(常量、变量和表达式)。,一维数组的存储结构与初始化 1、数组变量在内存中分配一片连续的存储单元,数组元素按数组下标从小到大连续存放。,2、数组的初始化 含义:在定义数组的同时,对数组各元素指定初值。 初始化是编译阶段完成的,不占用运行时间。 注意:用赋值语句或输入语句也可给数组元素指定初值,但赋值是在运行时完成的,占用运行时间。 对数组初始化的几种方法: 在定义数组时,对全部数组元素赋予初值,此时可省数组长度,系统自定。 例:int a =0,1,2,3,4; 等价于 int a5=0,1,2,3,4; 在定义数组时,对部分数组元素赋予初值。 例:int a5=1,2,b5; static int c5; a0=1,a1=2;其它为0;c0c4为0。 b0b4不确定。,二 维 数 组 定义: 类型标识符 数组名行数列数; 二维数组可看作一个二维表格,由行、列组成。 例1:int a23; 定义了一个23的数组a,即数组为2行3列,可存放6个整型数据。,以下错误的定义语句是 A)int x3=0,1,1,2,3; B)int x43=1,2,3,1,2,3,1,2,3,1,2,3; C)int x4=1,2,3,1,2,3,1,2,3,1,2,3; D)int x3=1,2,3,4;,【例1】完成下面的程序,此程序是求出数组a的两条对角线上的元素之和。,#include “stdio.h” main( ) int a33=1,3,6,7,9,11,14,15,17,sum1=0,sum2=0,i,j; for(i=0;i3;i+ ) for(j=0;j3;j+) if(i=j) sum1=sum1+aij; for(i=0;i3;i+) for(_ ;_;j- ) if(i+j=2 ) sum2=sum2+aij; printf(“sum1=%d,sum2=%dn”,sum1,sum2); ,字 符 串 与 字 符 数 组 1、基本概念: 字符数组:元素类型为字符类型的数组。 字符串:若干有效字符的序列,可包含转义字符、ASC码表中的字符;用双引号括起来的字符序列; 字符串的结束标志:0。 注:C语言中无字符串变量,字符串的存储完全依赖于字符数组中的。,2、字符数组的初始化 在定义字符数组时进行初始化 char ch7=s,t,u,d,e,n,t; 在对全部元素指定初值时,可省写数组长度。 char ch=s,t,u,d,e,n,t; 可直接用字符串初始化字符数组 char ch=“student”; 或:char ch=“student”; 而:char ch7=“student”; 是错误的。 但这时数组长度为8,系统自动在字符串尾部补上字符串结束标志0.,s t u d e n t 0,字符处理函数 库函数原型在string.h中。 (1)字符串拷贝函数:strcpy() 调用格式:strcpy(str1,str2); 功能:将原字符串str2复制到目标字符数组str1中。 注意:不能直接使用赋值语句来实现拷贝或赋值。 例:char s110,s210=student; s1=s2; s1=“student” (2)字符串连接函数strcat() 调用格式:strcat(str1,str2); 功能:将str2连同0连接到str1的最后一个字符(非0字符)后面。结果放在str1中。,(3)字符串比较函数strcmp() 调用格式:strcmp(str1,str2); 功能:若str1=str2,则函数返回值为0; 若str1str2,则函数返回值为正整数; 若str1str2,则函数值返回为负整数。 比较规则: 两个字符串自左至右逐个字符比较,直到出现不同字符或遇到0为止。 如字符全部相同,则两个字符相等; 若出现不同字符,则遇到的第一对不同字符的ASC大者为大。 例:if (strcmp(str1,str2)=0); 而:if(str1=str2);是错误的。,(4)字符长度函数strlen() 调用格式:strlen(字符串); 功能:求字符串的实际长度即所含字符个数(不包括0)。 例: strlen(“very0good”); (4),3、字符串的输入 (A)使用scanf函数输入字符串 例:char st15; scanf(“%s”,st); 但:scanf(“%s”, 注:输入时,以回车作为结束标志。可含空格。,4、字符串的输出 (A)用printf函数 例: char st15=“1234567”; printf(“st=%s,%c,%c”,st,st3,st6); 注:用printf输出字符串时,要用格式符“%s”,输出时从数组的第一个字符开始逐个字符输出,直到遇到第一个0为止。 (B)用puts函数 例:puts(ch); 将字符数组中包含的字符串输出,然后再输出一个换行符。因此,用puts()输出一行,不必另加换行符。,改为:“12340567”,字符串数组,char name310=“zhangsan”,“lisi”,“wangwu” ; 各元素的存储情况如下图所示:,name0 name1 name2,数组名作函数参数 数组名作函数参数时形参与实参都应使用数组名,且分别在被调用函数与主调函数中的说明。 实参与形参类型要一致。 实参数组与形参数组大小可以不一致。C编译程序不检查形参数的大小。 形参数组可不指定大小。(1)、在一维形参数组名后面可只根一对空方括号。为在被调用函数中处理数组元素的需要,可另设一参数来传递数组元素个数。(2)、对多维数组而言,形参的第一维可不指定,但其它维必须指定。 数组名做函数参数时是把实参数组的起始地址传给了形参数组,即:形参数组与实参数组对应同一段内存单元。 利用这个特点,可利用数组返回多个值。,#include maxmin(int b 4) int i,j,max,min; max=min=b00; for(i=0;imax)max=bij; else if(bijmin) min=bij;,b00=max;b01=min; return(max); main() int a34=1,0,-32,21,10,4, 4,4,345,2,12,0; printf(“max=%dn”,maxmin(a); printf(“max=%d”,a00); printf(“min=%d”,a01); ,例:求数组元素的最大值与最小值,并把它们分别放在第一、第二个元素中。,main() int a10; int i,m; void sort(int b ,int k); void print(int b ,int k); printf(“nInput m:”); scanf(“%d”,i+),if(bibi+1) t=bi, bi=bi+1,bi+1=t; flag=1; if (flag=0)break; void print(int b ,int k) int i; for(i=0;ik;i+) if(i%8=0)puts(“n”); printf(“%6d”,bi); ,例:用冒泡法将10 个整数按从小到大的顺序排序。,作业,2、计算1!+ 3!+ 5!+ + 99!。,3、输入一个二进制数,输出其对应的十进制数,4、2/1,3/2,5/3,8/5,/21/13.求该数列的前30项之和,5、求1000以内最大的完数。完数就是其真因子的和等于其本身的数。,1、2010年9月笔试真题,指 针,“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。 定义指针的目的是为了通过指针去访问内存单元。,int *p1; /*声明p1为一个整型指针变量,*/ float *p3,*p4; /*p3,p4是指向单精度类型变量的指针变量*/,&与*运算符 含义,含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左,含义: 取指针所指向变量的内容 单目运算符 优先级: 2 结合性:自右向左,两者关系:互为逆运算 理解,i_pointer-指针变量,它的内容是地址量 *i_pointer-指针的目标变量,它的内容是数据 &i_pointer-指针变量占用内存的地址,i_pointer &i &(*i_pointer) i *i_pointer *(&i),i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i),指针变量的使用,【例】 编写程序实现:输入a和b两个整数,按先大后小的顺序输出a和b。 #include main ( ) int * p1, *p2, *p, a, b; scanf (“ %d, %d“, 运行情况如下: 5,9 a=5, b=9 max=9, min=5,进一步理解 ) float y; int *p; p=,思考: 1)如果已经执行了p=再执行*i运算可不可以? 3)(*p)+和*p+的区别是什么?,指针运算,一、赋值运算,int a,*p=,指针加减算术运算,指针和整数可进行加、减、+,-运算。 设p是指向某一数组元素的指针, 开始时指向数组的第0号元素, 设n为一整数, 则p+n 就表示指向数组的第n号元素(下标为n的元素)。不论指针变量指向何种数据类型, 指针和整数进行加、减运算时, 编译程序总根据所指对象的数据长度对n放大。 例如: int a,*p1= 则其结果为p1向后移动了4个位置,同于int类型的数量点4个字节,则p1实际上向后移动了16个字节。,只有指向同一数组的两个指针变量之间才能进行相减运算,否则运算毫无意义。,两指针变量进行关系运算只有在指向同一数组的两指针变量之间进行才有意义。表示它们所指数组元素之间的关系。,数组元素表示方法 int a10,*p;,ai *(a+i),ai pi *(p+i) *(a+i),例 int a=1,2,3,4,5,6,7,8,9,10,*p=a,i; 数组元素地址的正确表示: (A)&(a+1) (B)a+ (C)&p (D)&pi,数组名是地址常量 p+,p- () a+,a- () a+1, *(a+2) (),例:main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(“%d“,p+); printf(“n“); for(i=0;i7;i+,p+) printf(“%d“,*p); ,例 将数组a中的n个整数按相反顺序存放,实参与形参均用数组,void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(“The array has been reverted:n“); for(i=0;i10;i+) printf(“%d,“,ai); printf(“n“); ,m=4,例 将数组a中的n个整数按相反顺序存放,void inv(int *x, int n) int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(“The array has been reverted:n“); for(i=0;i10;i+) printf(“%d,“,ai); printf(“n“); ,实参用数组,形参用指针变量,例 将数组a中的n个整数按相反顺序存放,void inv(int *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(“%d“,p); p=a; inv(p,10); printf(“The array has been reverted:n“); for(p=a;pa+10;p+) printf(“%d“,*p); ,实参与形参均用指针变量,例 将数组a中的n个整数按相反顺序存放,void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(“%d“,p); p=a; inv(p,10); printf(“The array has been reverted:n“); for(p=arr;parr+10;p+) printf(“%d “,*p); ,实参用指针变量,形参用数组,对于二维数组: (1)a是数组名, 包含三个元素 a0,a1,a2 (2)每个元素ai 又是一个一维 数组,包含4个 元素,int a34;,基类型,行指针与列指针,指针与二维数组,对二维数组 int a34,有 a-二维数组的首地址,即第0行的首地址 a+i-第i行的首地址 ai *(a+i)-第i行第0列的元素地址 ai+j *(a+i)+j -第i行第j列的元素地址 *(ai+j) *(*(a+i)+j) aij,a+i=&ai=ai=*(a+i) =&ai0, 值相等,含义不同 a+i &ai,表示第i行首地址,指向行 ai *(a+i) &ai0,表示第i行第0列元素地址,指向列,指针与字符串,例 main( ) char string=“I love China!”; printf(“%sn”,string); printf(“%sn”,string+7); ,例 main( ) char *string=“I love China!”; printf(“%sn”,string); string+=7; while(*string) putchar(string0); string+; ,string=“I love China!”;,字符指针变量与字符数组 char *cp; 与 char str20; str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址 char str20; str=“I love China!”; () char *cp; cp=“I love China!”; () str是地址常量;cp是地址变量 cp接受键入字符串时,必须先开辟存储空间,字符串与数组关系 字符串用一维字符数组存放 字符数组具有一维数组的所有特点 数组名是指向数组首地址的地址常量 数组元素的引用方法可用指针法和下标法 数组名作函数参数是地址传递等 区别 存储格式:字符串结束标志 赋值方式与初始化 输入输出方式:%s %c,char str=“Hello!”; () char str=“Hello!”; () char str=H,e,l,l,o,!; () char *cp=“Hello”; () int a=1,2,3,4,5; () int *p=1,2,3,4,5; (),char str10,*cp; int a10,*p; str=“Hello”; () cp=“Hello!”; () a=1,2,3,4,5; () p=1,2,3,4,5; (),scanf(“%s”,str); printf(“%s”,str); gets(str); puts(str);,字符串指针作函数参数,例 用函数调用实现字符串复制,(1)用字符数组作参数(,(2)用字符指针变量作参数,void copy_string(char from,char to) int i=0; while(fromi!=0) toi=fromi; i+; toi=0; main() char a=“I am a teacher.“; char b=“You are a student.“; printf(“string_a=%sn string_b=%sn“,a,b); copy_string(a,b); printf(“nstring_a=%snstring_b=%sn“,a,b); ,void copy_string(char *from,char *to) for(;*from!=0;from+,to+) *to=*from; *to=0; main() char *a=“I am a teacher.“; char *b=“You are a student.“; printf(“string_a=%snstring_b=%sn“,a,b); copy_string(a,b); printf(“nstring_a=%snstring_b=%sn“,a,b); ,结构体 结构类型定义,“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ;,成员类型可以是 基本型或构造型,struct是关键字, 不能省略,合法标识符 可省:无名结构体,一、结构的定义,例 struct student int num; char name20; char sex; int age; float score; char addr30; ;,结构体类型定义描述结构 的组织形式,不分配内存,结构体类型定义的作用域,括号后的分号不可省。结构定义之后,即可进行变量说明。结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。,结构体变量说明,1、先定义结构体类型,再定义结构体变量 2、定义结构体类型的同时定义结构体变量 3、直接定义结构体变量,例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,说明 结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆,结构体变量的引用 引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用,引用方式: 结构体变量名.成员名,结构体变量初始化: struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,结构体数组 结构体数组的定义 三种形式:,形式一: struct student int num; char name20; char sex; int age; ; struct student stu2;,形式二: struct student int num; char name20; char sex; int age; stu2;,形式三: struct int num; char name20; char sex; int age; stu2;,结构体数组初始化,例 struct int num; char name20; char sex; int age; stu =,;,结构体数组引用,引用方式: 结构体数组名下标.成员名,指向结构体变量的指针 指向结构体变量的指针 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p;,使用结构体指针变量引用成员形式,存放结构体变量在内存的起始地址,指向运算符 优先级: 1 结合方向:从左向右,例 指向结构体的指针变量,#include struct stu int num; char name20; char sex; float score; student1=1001, “LiXiao“,M, 89.00,*pstu; void main( ) pstu= ,例 int n; int *p= n=10,struct stu int num; char name20; char sex; float score; student1,student2,*pstu1= (*pstu1).num=101,指向结构体数组的指针,例 指向结构体数组的指针,#include struct stu int num; char name20; char sex; float score; student5= 1001, “LiXiao“, M, 89.00, 1002, “Jin“,F,90.00, 1003, “Feng“,F,60.50, 1004, “Rong“,M, 74.50, 1005, “ZhuJi“,F, 55.00; void main( ) struct stu *ps,*p1,*p2,temp; printf(“Before Sorted:n“); printf(“NotNamettSextScoretn“); for(ps= student;psnum,ps-name,ps-sex,ps-score); for(p1= student;p1scorep1-score) temp=*p1;*p1=*p2;*p2=temp; printf(“After Sorted:n“); printf(“NotNamettSextScoretn“); for(ps= student;psnum,ps-name,ps-sex,ps-score); , ,在上例中,可使用的是(*p).num这样的形式。(*p)表示p指向结构体变量,(*p).num是p指向的结构体变量中的成员num。注意:*p两侧的括弧不可省。,请分析以下几种运算: p-n 得到p指向的结构体变量中的成员n的值。 p-n+ 得到p指向的结构体变量中的成员n的值,用完该值后使它加1。 +p-n 得到p指向的结构体变量中的成员n的值使之加1(先加)。,结构体与函数,用指向结构体的指针作函数参数 用结构体变量的成员作参数-值传递 用指向结构体变量或数组的指针作参数-地址传递 用结构体变量作参数-多值传递,效率低,#include“stdio.h“ struct stu int num; char name20; char sex; float score; student5= 1001,“LiXiao“, M, 89.00, 1002,“Jin“,F ,90.00, 1003,“Feng“,F ,60.50, 1004,“Rong“,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论