《C语言基础知识》PPT课件.ppt
1,数据结构与算法C语言的基础知识,2,主要内容,C语言简介数据类型与声明运算符与表达式数组指针结构体,3,简单的C语言源程序,#includestdio.hmain()printf(*n);/*n表示换行*/printf(*Hello!*n);printf(*n);,主函数,输出函数,注释,4,C程序的构成,一个C语言的源程序通常由一个或若干个函数构成,函数是C程序的基本单位,这些函数可以包含在一个或者多个源文件内。一个C程序中必须有一个main函数,它可以放在程序的任何地方。程序总是从main函数开始执行。函数可以是系统提供的库函数,也可以是用户根据自己需要编制的自定义函数。,5,主要内容,C语言简介数据类型与声明运算符与表达式数组指针结构体,6,数据类型与声明,数据类型,指针类型,空类型,构造类型,7,在程序运行过程中其值不能改变的量叫做常量。常量分为整型常量(如果是长整型,要在数字后面加L)、实型常量、字符型常量等。constfloatPI=3.1415926符号常量:值在本文件内不能改变,也不能再赋值。defineMAXSIZE16C语言规定标识符只能由字母打头,后面跟字母、数字或下划线,大小写不通用。(在TurboC中标识符的长度可以超过8个字符)一般符号常量名用大写,变量名用小写,以示区别。,常量,8,在程序运行过程中其值可以改变的量叫做变量。变量要先定义(即使用类型标识符作说明)再使用。intnum;charname;,变量,9,整型数据,C语言中的整型常量可以用十进制、八进制和十六进制表示。八进制数以0开头,十六进制数以0 x开头。(0为数字0)C语言中的整型变量分为基本型、短整型、长整型、无符号型。一般短整型不大于基本型,长整型不小于基本型。,10,字符型数据,C语言中的字符型数据有:单字符常量转义字符常量字符串常量字符变量,11,单字符常量,单字符常量用单引号括起来类型标识符为char,输出时用%c表示。按ASCII码存储,每个字符占一个字节。给字符变量赋值时可以赋予字符的ASCII码。例如:chara=65的结果是a变量中存放一个字母A。main()chara=a,b=b,c=c,d=68;a=a+1;b=b+2;c=c+3;d=d+4;printf(%c%c%c%cn,a,b,c,d);运行结果:bdfH,12,字符串常量,字符串常量用双引号括起来CHINAcharc;c=a;charc;c=a没有字符串变量.用数组来存放,数组长度大于字符串长度。charc10=China;输入输出printf(%s,c);scanf(%s,c);字符串处理函数:puts(c);gets(c);strcat(str1,str2);strcpy(str1,str2);,13,主要内容,C语言简介数据类型与声明运算符与表达式数组指针结构体,14,算术运算符及表达式,、*、%(取余)例如:7%4得3注意:float型数据不能做%运算优先级:先*、%,后、结合性:自左至右,15,自增和自减运算,自增、自减例如:a、a相当于aa1a、a相当于aa1但是:a是先自增再使用,a是先使用再自增。注意:float型数据不能做或运算。,16,主要内容,C语言简介数据类型与声明运算符与表达式数组指针结构体,17,数组,数组的定义方式一维数组的定义方式为:类型说明符数组名常量表达式inta5;5个元素是:a0、a1、a2、a3、a4。二维数组的定义方式为:类型说明符数组名常量表达式常量表达式floata32,a数组有三行两列共6个元素,分别是:a00、a01、a10、a11、a20、a21;,18,数组名的命名规则和变量名相同,下标从0开始,方括号内是元素个数。方括号内的常量表达式的值必须是整型数,不能是变量。当定义数组语句中不同时给变量赋值时,方括号内不得为空。二维数组在内存中是按行存放的。数组名代表的是该数组的起始地址.C语言允许使用多维数组。,关于数组的说明,19,数组的赋值,在定义数组后数组中的各个变量自动取随机数。intb10;b1=3;将3赋给b1,其他元素为随机数。可以在定义数组时对数组中的全部变量或部分变量赋值。也可以在以后的语句中为变量赋值。inta5=3,4,5,6,7;将五个数依次赋给a数组在定义数组时为部分变量赋值后,其他元素为0。intb10=0intb10=3,2,1,0;将四个数依次赋给b0b3,其他元素为0在给全部元素赋初值时,可以不用给出长度.inta=1,2,3,4,5,20,主要内容,C语言简介数据类型与声明运算符与表达式数组指针结构体,21,指针,是C语言的一个重要概念可以有效地表示复杂的数据结构能动态分配内存能方便地使用字符串能有效而方便地使用数组在调用函数时能得到多于一个的值能直接处理内存地址,22,指针,地址和指针变量的指针和指向变量的指针变量数组与指针,23,地址的概念,程序定义了一个变量,在编译时就给这个变量分配内存单元,内存区的每一个字节有一个编号,这就是地址在程序中通过变量名来对内存单元进行存取操作程序编译以后已经将变量名转换为变量的地址。scanf(%d,变量i变量j变量k,200020022004,3010,变量i_pointer,24,地址和指针,一个变量的地址称为该变量的指针。通过变量的地址能找到该变量在内存中的存储单元,从而得到它的值。变量i访问方式:直接访问:按变量地址存取变量值的方式.i=3;printf(%d,i);间接访问:*表示指向,定义i_pointer,*i_pointer*i_pointer=3;scanf(%d,25,指针,地址和指针变量的指针和指向变量的指针变量数组与指针,26,指向变量的指针变量,存放地址的变量叫做指针变量。在一个指针变量中只能存放同一类型变量的地址。指针变量必须先定义,指定它的类型,才能使用。基类型*指针变量名;例如:int*a,*b;指向某数据的指针变量存放的是该数据的首地址,也就是说,指向的是该数据的首字节。int占2个字节,char占1个字节,float占4个字,使一个指针变量指向另一个变量指针变量名=,27,指针变量的引用-1,在表达式中,可以使用以下两个运算符(定义a为包含10个整型数据的数组)int*p;(定义p为指向整型变量的指针变量)p=,a0,a9,p=p=p+1此时,p指向数组a数组的第二个元素。*(p+1)=a1,a0,a9,p,a数组,p+1,a+1,a1,a2,p+i,a+i,p+9,a+9,31,通过指针引用数组元素-2,指向数组的指针变量也可以带下标。例如:inta10;int*p=可以使用ai、pi、*(a+i)或*(p+i)引用数组中的第i+1个元素。移动指针可以使用p+、p-,但注意指针不能超出数组元素的范围。+和*是同优先级,从右至左的结合方向。例如*p+和*(p+)等价指针不允许进行乘除运算。,32,主要内容,C语言简介数据类型与声明运算符与表达式数组指针结构体,33,结构体,什么时候需要结构体类型?结构体类型变量的定义结构体变量的引用结构体变量的初始化结构体数组指向结构体类型数据的指针用指针处理链表,34,什么时候需要结构体类型?,一类用户自定义的数据类型structstructstudentintnum;charname20;charsex;intage;floatscore;charaddr30;,35,结构体变量的定义-1,struct结构体名成员表列;类型名成员名先定义结构体类型再定义变量名structabcinta;charb;floatc;chard30;以上定义了一个结构体类型,并指定了其中各成员的名字和它们的类型。再有:structabcxx1,xx2,xx3;,定义了三个变量:xx1、xx2和xx3,它们都具有structabc的类型结构。,36,结构体变量的定义-2,在定义类型的同时定义变量,一般形式为:struct结构体名成员表列变量名表列;例如:structabcinta;charb;floatc;chard30;xx1,xx2,xx3;结果和前面一样。,37,结构体变量的定义-3,也可以直接定义结构体变量struct成员表列变量名表列;,38,结构体变量的定义-4,结构体变量的成员,可以单独使用,作用与地位相当于普通变量,成员也可以是一个结构体变量structdateintmonth;intday;intyear;structstudentintnum;charname20;charsex;structdatebirthday;/*birthday是structdate类型*/student1,student2;,39,结构体变量占用的内存,只有在定义变量后,才为该变量分配内存单元。结构体变量所占的内存长度等于每个成员长度之和。#includemain()structdateintyear,month,day;today;printf(%dn,sizeof(structdate);运行结果:12(VC+环境下),40,结构体,什么时候需要结构体类型?结构体类型变量的定义结构体变量的引用结构体变量的初始化结构体数组指向结构体类型数据的指针用指针处理链表,41,结构体变量的引用,不能对结构体变量整体进行输入输出,只能对结构体变量中的成员分别进行输入和输出。引用结构体变量中各个成员的方式为:结构体变量名.成员名可以对变量的成员赋值student1.num=99082;如果成员又是结构体类型,则要用多个成员运算符,找到最低一级的成员。student1.birthday.month,42,结构体,什么时候需要结构体类型?结构体类型变量的定义结构体变量的引用结构体变量的初始化结构体数组指向结构体类型数据的指针用指针处理链表,43,结构体变量的初始化,可以在定义时指定初始值#includestdio.hmain()structstudentintnum;charname20;charsex;a=89031,LiLin,M;printf(No.%dnname:%snsex:%cn,a.num,a.name,a.sex);,44,结构体,什么时候需要结构体类型?结构体类型变量的定义结构体变量的引用结构体变量的初始化结构体数组指向结构体类型数据的指针用指针处理链表,45,结构体数组,和定义结构体变量相似,只需要说明其为数组即可structstudentintnum;charname20;charsex;structstudentstu3;structstudentintnum;charname20;charsex;stu3;,46,结构体数组初始化,structstudentintnum;charname20;charsex;stu3=89031,LiLin,M,89032,LiuYing,M,89036,WangMin,F;,47,结构体,什么时候需要结构体类型?结构体类型变量的定义结构体变量的引用结构体变量的初始化结构体数组指向结构体类型数据的指针用指针处理链表,48,指向结构体类型数据的指针,一个结构体变量的指针就是该变量占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量。指向结构体变量的指针structstudentintnum;charname20;charsex;floatscore;structstudentstu1;structstudent*p;p=为了方便,可以把(*p).num改用p-num来代替,以下三种形式等价:结构体变量名.成员名(*p).成员名p-成员名,49,结构体,什么时候需要结构体类型?结构体类型变量的定义结构体变量的引用结构体变量的初始化结构体数组指向结构体类型数据的指针用指针处理单链表,50,动态申请内存,数组的长度是预先定义好的,在整个程序中固定不变。语言中不允许定义动态数组。实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。,51,C语言动态内存的函数,分配内存空间函数malloc调用形式:(类型说明符*)malloc(size)功能:在内存的动态存储区中分配一块长度为size字节的连续区域。函数的返回值为该区域的首地址。pc=(char*)malloc(100);释放内存空间函数free调用形式:free(void*ptr);free(pc