




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、什么是C语言C语言是面向结构的计算机高级语言,其兼具一般高级语言和低级语言的优点,c语言功能强大、应用广泛,既可以用来编写系统软件,也可以用来编写应用软件。它具有以下几个特点:(1) 语言简洁、紧凑,使用方便、灵活。C语言程序比其他许多高级语言简练,源程序短,因此输入程序时工作量少。(2) 运算符丰富。C语言的运算符包含的范围很广泛,共有34种运算符,(3) 数据类型丰富。C语言提供的数据类型有:整型、浮点型、字符型、数组类型、指针类型、结构体类型、共用体类型等,能用来实现各种复杂的数据结构(链表、树、栈等)的运算。(4) 具有结构化的控制语句(如ifelse语句、while语句、dowh
2、ile语句、switch语句、for语句)。用函数作为程序的模块单位,便于实现程序的模块化。C语言是完全模块化和结构化的语言。(5) 语法限制不太严格,程序设计自由度大。(6) C语言允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。(7) 生成目标代码质量高,程序执行效率高 。(8) 用c语言编写的程序可移植性好(与汇编语言比)。二、c程序设计中的“共性”(1) C程序是由函数构成的。一个C源程序有且仅有一个main函数,也可以包含一个main函数和若干个其他函数。因此,函数是C程序的基本单位。(2) 一个函数由两部分组成:Ø 函数的首部,即函
3、数的第一行,包括函数名、函数类型、函数参数(形式参数)名、参数类型。Ø 函数体,即函数首部下面花括号内的部分。函数体一般包括以下两部分。l 声明部分。在这部分中定义所用到的变量和对所调用函数的声明。l 执行部分。由若干语句组成。(3) 一个C程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何。(4) C程序书写格式自由,目前使用的许多C编译系统,允许一行内写几个语句,一个语句可以写在多行上。(5) 每个语句和数据声明的最后必须有一个分号。分号是C语句的必要组成部分。(6) C语言本身没有输入输出函数语句。输入输出由输入输出函数来完成。(7) 可以用/*/对c程
4、序中的某行或某几行做注释。三、运行C程序的步骤上机输入与编辑源程序(.c)->对源程序进行编译,得到目标程序(.obj)->将目标程序与库函数连接,得到可执行程序(.exe)->运行可执行程序,得到运行结果。四、程序的灵魂-算法Ø 程序=数据结构+算法Ø 为解决一个问题而采取的方法和步骤,就称为算法。计算机算法分为两大类:数值运算算法和非数值运算算法。Ø 算法描述:自然语言、流程图、N-S流程图、伪代码、计算机语言。五、数据类型、运算符与表达式(1) 数据类型Ø 在 C 语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类
5、型四大类。Ø 基本数据类型包括:整型(短整型(short int)、基本整型(int)、长整型(long int)、字符型(char)、实型(单精度型(float)、双精度型(double)、长双精度型(long double)、枚举类型(enum)Ø 构造类型包括:数组类型、结构体类型(struct)、共用体类型(union)(2) 标识符:在C语言中用来对变量、符号常量、函数、数组、类型等数据对象命名的有效字符序列统称为标识符。标识符由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。(3) 基本数据类型1)整型常量的表示方法:Ø 十进制整常量没
6、有前缀。Ø 八进制整常数必须以 0 开头,数码取 07,八进制通常是无符号数。Ø 十六进制整常数前缀 0X 或 0x,数码取值 09、AF 或 af。整型常数可以有后缀 L 或 l、U 或 u,表示的整数范围要广,一般 C 编译系统给普通数分配两字节空间,长整型分配 4 字节空间。2) 整型变量Ø 在内存中,数值以补码表示。Ø 正数补码与原码相同,负数补码为绝对值按位取反再加 1。Ø 整型变量分类:基本整型(int)、短整型(short int) 在内存中都占两个字节,长整型(long int)占 4 字节。(具体由编译系统决定)无符号型(un
7、signed)与上面三种类型匹配使用。几个范围:-3276832767,065535定义:类型说明符 变量名标识符,变量名标识符,.;3) 实型常量(也称为浮点型)Ø 表示方法:十进制小数形式,如 5.789;指数形式,aen(a 为十进制数,n 为十进制整数)实型常数都按双精度 double 型处理。标准 c 允许浮点数使用后缀,f 或 F,表示该数为浮点数。4)实型变量Ø 实型数据一般占 4 字节内存空间,由数符(+、 -)、小数部分、指数三部分构成,在 Turbo C 中,单精度占 4 字节空间,只能提供 7 位有效数字。双精度占 8 字节空间,可提供 16 位有效数
8、字。长双精度占 16 字节空间,可提供 19 位有效数字。注意:提供 7 位有效数字并不是说显示结果只有 7 位,只有前 7 位可以正确显示,之后的为无效数字。双精度有效位 16 位,但是 Turbo C 规定小数后最多保留六位,其余部分四舍五入。5)字符常量用单引号括起来的一个字符。把数字括起来就不能当做数字进行数值运算。6)转义字符了解常用转义字符的含义。如n,t,b,r,',",f,ddd,xhh。理论上来说,c 语言字符集中的任何一个字符均可以由转义字符表示,最后两个转义字符正是为此而提出的。7)字符变量每一个字符变量分配一个字节空间,因此只能存贮一个字符。实际上字符
9、是以 ASCII 码(美国标准信息交换码)的形式存储在空间单元里。c 语言允许把字符变量按整型量输出,也准许把整型量按字符量输出。大小写字母的 ASCII 码相差 32。大写字母 ASCII 码数值较小。8) 字符串常量Ø 字符串常量由双引号括起来。"CHINA","C program"Ø 字符常量可以赋值给字符变量,但是 C 语言中没有相应的字符串变量。Ø 字符串常量可以用一个字符数组来存放。字符串常量占的内存字节数等于字符串中字节数加 1,增加的一个为"0",结束符号。如"a"的存
10、放占 2 字节,'a'的存放占 1 字节。(4) 变量赋值允许在变量定义时候赋值,但是不能连续赋值,如 a=b=c=5 是不合法的。(5) 各类数值型数据之间的混合运算1)若参与运算量的类型不同,则先转换为同一类型,然后进行运算。2)转换按数据长度增加的方向进行,以保证精度不降低。3)所有的浮点运算都是以双精度进行的。4)char 型和 short 型参与运算时,必须先转换为 int 型。5)赋值运算中,赋值号两边的数据类型不同时,赋值号右边量的类型将转换为左边的类型。这可能导致精度丢失,丢失的部分按四舍五入。6)强制类型转换:(类型说明符)(表达式)。该转换只是临时的转换,而
11、不改变数据说明时对该变量定义的类型。(6)算术运算符和算术表达式C 语言中的运算符和表达式数量非常多,使得 C 语言功能完善的同时增加了 C 语言的复杂度。运算符具有优先级和结合性两个特点让运算十分灵活。1)算术运算符和算术表达式+ - * / % 、+i 、-i 、i+ 、i注 1:除法参与运算量均为整数时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。如 20/7 结果为 2,20.0/7=2.857143注 2:C 语言中左结合性指自左至右运算,如 x+y+z,=号具有右结合性。单目运算符、三目运算符、赋值运算符具有右结合性。c 语言中,有 15 个优先级,1 级
12、最高,15 级最低。注 3:求余运算符要求参与运算的均为整型。注 4:单目,双目运算符的概念。注 5:注意理解+i 与 i+的区别。+i 表示在执行+i 所在语句时先有一条 i=i+1 指令,i+表示在执行 i+所在语句之后有一条 i=i+1 指令。(7) 赋值运算符和赋值表达式=它具有右结合性,如 a=b=c=5 可理解为 a=(b=(c=5),=定义为运算符的含义是凡是表达式可以出现的地方均可以出现赋值表达式。赋值表达式会把右边的类型转换为左边的类型。+=,-=,/=,%=,<<=,>>=,&=,=,|=复合赋值符的写法十分有利于编译处理,能提高编译效率并产
13、生质量较高的目标代码。(8)逗号运算符和逗号表达式 C 语言中逗号也是一种运算符。其功能是把两个表达式连接起来组成一个表达式表达式 1,表达式 2其求值过程是分别求两个表达式的值,并以表达式 2 的值作为整个逗号表达式值如 y=(x=2+2),3+3),则 y 的值为 6六、最简单的 c 程序设计-顺序程序设计(1) c 程序结构:一个程序可以由多个源程序文件组成;每一个源程序文件由预处理命令、全局变量声明、函数 1、函数 2、函数 n 组成;每一个函数由函数首部和函数体构成;每一个函数体由局部变量声明、执行语句构成。(2) 程序功能由执行语句实现,c 语句可分为 5 类:1)表达式语句;2)
14、函数调用语句;3)控制语句;4)复合语句;5)空语句表达式;函数名(实际参数表);控制语句有 9 种;复合语句由括起来;只有“;”的语句称为空语句。(3)赋值语句注意在变量说明中,不允许连续给多个变量赋初值,如 int a=b=c=5;是错误的。而赋值语句允许连续赋值。注意赋值语句和赋值表达式的区别。语句有;号,而表达式没有。表达式可以出现在允许表达式出现的地方,而赋值语句则不能。(4)数据输入输出的概念及在 c 语言中的实现在 C 语言中,所有的输入/输出都是由库函数完成的。在使用 C 语言库函数时,要用预编译命令#include 将有关“头文件”包括到源文件中。使用标准输入输出库函数要用到
15、“stdio.h”文件,因此源文件开头应有以下预编译命令:#include<stdio.h> 或 #include "stdio.h"。stdio 是 standard input&output。考虑到 printf 和 scanf 函数使用频繁,系统允许在使用这两个函数时可以不加。(5)字符数据的输入输出putchar (字符变量);字符输出函数,在显示器上输出单个字符。对于控制字符则执行控制功能,不在屏幕上显示。使用本函数前必须要用头文件包含命令:#include<stdio.h>或eg:putchar('A')输出 A;
16、putchar(x)输出 x 的值;putchar('n')换行。getchar(); 从键盘上输入一个字符。通常把输入的字符赋予一个字符变量,构成赋值语句。 eg:char c;c=getchar();注意:getchar 函数只能接受单个字符,多余一个只接受第一个。putchar(getchar(); printf("%c",getchar();(6)格式输入输出printf("格式控制字符串",输出表列) 格式输出函数。f 为格式(format)之意。格式控制字符串以%开头后接格式字符。 格式字符:标志输出最小宽度.精度长度类型;为
17、可选项。标志:- + 空格 #:-表示左对齐,右边填空格;#对 o 类和 x 类输出时加前缀。输出最小宽度:若实际位数多余定义的宽度,则按实际位数输出,否则补空格精度:若输出数字,表小数的位数,直接去掉多余位;若输出字符表字符个数长度:h,l 两种,分别表示按短/长整型输出。scanf("格式控制字符串",地址表列) 格式输入函数。格式控制字符串:%*输入数据宽度长度类型* 符:用以表示该输入项,读入后部赋予相应的变量。宽度:超过宽度的部分将被截去。地址由地址运算符"&"后跟变量名组成 eg:&a,&b,&a 是一个表达式
18、,其功能是求变量的地址。在输入多个字符数据时, C 编译在碰到空格、 tab、回车或非法数据时即认为该数据结束。如 12A,A 为非法数据。如果格式控制串中有非格式字符则输入时也要输入该非格式字符。eg:scanf("a=%d,b=%d,c=%d",&a,&b,&c);a=5,b=6,c=7 eg:scanf("%d%d%d",&a,&b,&c);七、选择结构(1) 关系运算符:C 语言有 6 种,<,<=,>,>=,=,!=和!=的优先级在关系运算符中相对较低,关系运算符高于赋值运
19、算符,低于算术运算符。(2)逻辑运算符:&&,|,!,前两个具有左结合性,双目运算符。优先级:!>算术运算符>关系运算符>&&和|>赋值运算符;!>&&>|(3) if-else 语句和 if-else if-else 语句。if 语句可以嵌套使用。(4)条件运算符和条件表达式 表达式 1?表达式 2:表达式 3 如果表达式 1 的值为真,则以表达式 2 的值为条件表达式的值,否则以表达式 3eg:max=(a>b)?a:b;注意:条件表达式是右结合,结合方向自右向左。eg:a>b?a:c>d
20、?c:d 应理解为 a>b?a:(c>d?c:d) (5)多分支选择语句 switchswitch(表达式)case 常量表达式 1: 语句 1;case 常量表达式 2: 语句 2;case 常量表达式 n: 语句 n; default : 语句 n+1; 八、循环控制方法四种(1)goto 语句和 if 语句构成循环;goto 语句标号;goto 是无条件转移指令。标号是一个有效的标识符加上一个":"一起出现在函数的某处。goto 语句一般不用,因为它使得程序层次不清,且不易读懂,但在多层嵌套退出时,用 goto语句则比较合理。(2)while(表达式)语句
21、;(3)do语句while(表达式)(4)for(表达式 1;表达式 2;表达式 3)语句其最简单应用形式:for(循环变量赋初值;循环条件;循环变量增量)语句注意:三个表达式均可以省略,要注意省略所带来的问题。(5) break 语句跳出 switch、do-while、while、for。break 对 if-else 不起作用,break 用于多层循环嵌套,一次只跳出一个循环。(6)continue:跳出本次循环。九、数组(1) 一维数组定义方式:类型说明符 数组名 常量表达式(元素个数);eg:int a10; char ch20;数组名不能与其它变量重名。比如 int a; floa
22、t a10;是不对的。方括号中不能用变量来表示元素的个数,但可以是符号常数或常量表达式。调用:数组名下标;在 c 语言中只能逐个使用下标变量,而不能一次引用整个数组。a5.2=a5.8=a5 当下标不为整数时,自动取整。赋值:int a10=0,1,2,3,4,5;int b=1,2,3可以只给部分元素赋初值。只能给元素逐个赋值。若给全部元素赋值,可以不指定元素个数。(2) 二维数组定义方式:类型说明符 数组名常量表达式 1常量表达式 2引用:数组名下标下标注意区分下标和数组说明时下标的不同,数组说明时只能是常量,它是说明数组在某一维上的最大长度,而引用时候的下标可以是常量、变量或表达式。赋值
23、:int a32=1,25,67,3;对于二维数组的初始化说明: 1)可以只对部分元素初始化,未赋值的元素自动取 0 值。 2)如果全部元素赋初值,则第一维长度可以不给出。3)二维数组可以分解为一维数组的组合 (3)字符数组char c="C program" char c='C',' ','p','r','o','g','r','a','m'上面两种方法可以得到一样的输出结果,但是字符串赋值比用字符逐个赋值多占一个字节,用于存放字
24、符结束标志'0'。 '0'是由 C 编译系统自动加上的,由于采用'0'标志,所以在用字符串赋初值时一般无需指定数组长度,而由系统自定。若没有给字符串数组赋初值,则必须对其指定长度。采用字符串方式对于字符数组的输入输出也有帮助,在输出时可以直接用字符串变量名表示字符串。printf("%sn",c) ,c 为字符串名。当用 scanf 函数输入字符串时若输入空格字符,将被当做结束标志。eg:scanf("%s%s%S%s",st1,st2,st3,st4);st1,st2,st3,st4 分别为字符串(4)字
25、符串处理函数puts(字符数组名) :把字符数组的字符串输出到显示器。gets(字符数组名) :从标准输入设备键盘输入一个字符串。若使用 gets 函数,当输入字符串中含有空格时,输出仍未所有字符,说明 gets 函数并不以空格作为结束标志,而只以回车作为结束标志。这是与 scanf 函数不同的地方。strcat(字符数组名 1,字符数组名 2):把字符数组 2 中的字符串连接到字符串 1 的后面,并删去字符串 1 后的标志“0”。本函数返回值是字符数组 1 的首地址。strcpy(字符数组名 1,字符数组名 2);将 s2 拷贝到 s1,s1 要够长。返回 s1 首地址。strcmp(字符数
26、组名 1,字符数组名 2);按照 ASCII 码进行比较,返回比较结果。从第一个字母开始往后比。若 s1=s2,返回 0;若 s1>s2,返回>0;若 s1<s2,返回<0。strlen(字符数组名):测字符串实际长度(不含字符串结束标志'0')并作为返回值。十、函数(1)main 函数是主函数,允许它调用其它的函数,不允许其它函数调用它。C 程序的执行总是从 main 开始,完成对其它函数的调用后再返回到 main 函数,最后由 main 结束。一个 C程序,必须有且只能有一个 main 函数。函数的使用要在主函数中像变量一样先声明后使用。(2)函数的
27、定义:内容为可选类型标识符 函数名(形式参数列表)声明部分语句(3)实参和形参形参只有在被调用时才分配内存单元,其作用域是函数内部,函数调用结束返回主函数则不能使用该形参。函数调用中发生的数据传送是单向的,只能把实参的值传送给形参,而不能反向操作。实参和形参是函数实现主调函数向被调函数传送数据的方式,在传递时,实参的值必须是确定的,而且应该与形参在数量上、类型上、顺序上严格一致。(4)函数返回值函数值只能通过 return(表达式);或 return 表达式;返回。函数中允许有多个 return,但是每次调用只能有一个 return 语句被执行,因此只能返回一个函数值。不返回函数值的函数应该定
28、义为 void 类型。(5) 函数的调用:不用多说,函数名(实际参数表)。注意的是主调函数中调用某函数之前应该对被调函数进行说明(声明)。C 语言中主调函数可以省去对被调函数说明的情况:1)被调函数的返回值是整形或字符型,系统自动对被调函数返回值按整型处理。2)被调函数定义出现在主调函数之前。3)如果在所有函数定义之前,在函数外预先说明各个函数的类型。(6)函数的嵌套和递归调用(7)使用数组名作为函数参数:数组名也就相当于数组的首地址,当把首地址赋给形参时,形参的数组与实参的数组占用的是相同的内存单元。这点与变量或常量作为形参是不同的,变量和常量作为形参,计算机为实参和形参分配了不同的内存单元
29、,数据是单向传递,但是用数组名作为形参时数据是双向传递的。使用时注意:1)形参数组和实参数组类型必须一致。2)形参数组和实参数组长度可以不一样,因为调用时只传送首地址而不检查长度。3)在函数参数表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。eg:void nzp(int a,int n)其中形参 a 没有给出长度,由 n 值动态指定,n 值由主调函数的实参进行传送。十一、指针(1)指针编程是 C 语言最主要的风格之一,是 C 语言中广泛使用的一种数据类型。利用指针可以表示各种数据结构;能方便地使用数组和字符串;能处理内存地址,从而编出精练的高效程序。(2)指针就是某个内存单
30、元的地址,对于某个单元来说,单元的地址即为指针,其中存放的数据才是单元内容。 C 语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某个内存单元的指针。严格地说,一个“指针”是一个地址,是一个常量,“指针变量”是指取值为地址的变量。定义指针的目的就是为了通过指针去访问内存单元。(3)变量的指针和指向变量的指针变量这句话很拗口,但是要搞清楚它。变量的指针就是变量的地址,指向变量的指针变量就是指针变量的值是变量所在地址。eg:i_pointer 为 011A,地址 011A 中的内容为 3,i=3;*i_pointer=3;第二个语句的含义是
31、将 3 赋给指针变量所指向的变量 i,i 在 011A 单元。(4) 指针变量的定义:类型说明符 *变量名;指针变量的定义包括三个内容:指针类型,指针变量名,指针所指向的变量的类型。*表示这是一个指针变量。一个指针变量只能指向同类型的变量。如 char *p3;p3 指向浮点变量,具体指向的变量值由对 p3 所赋的值来决定。(5) 指针变量的引用:指针变量使用之前不仅要定义,而且必须赋予具体的值。未经赋值的指针不能使用,否则会造成系统混乱。指针变量只能赋予地址,在 C 语言中,变量的地址是由编译系统分配的,对用户不透明,有两个有关的运算符:1)&:取地址运算符,用来表示变量的地址。2)
32、*:指针运算符(或称为间接访问运算符)。不能把一个数赋予指针变量。eg:int a; int *p; p=&a;p+表示 p 指向下一个数据地址地址,如对 int 型,p+则 p 的值增加 2,对 float 型,p+则 p 的值增加 4。可以利用指针完成返回多个数的功能,如交换两个数,需要函数返回两个值,用指针可以不用返回值做到。(6) 指针变量的运算:int a,*pa; pa=&a;int a,*pa=&a,*pb; pb=pa;int a5,*pa; pa=a;(或 pa=&a0;)char *pc="C Language" 把存放字
33、符串的字符数组的首地址装入指针变量。 int (*pf)(); pf=f; f 为函数名,把函数的入口地址赋予指向函数的指针变量。指针与数字的加法运算:数组指针变量的加 1 指的是指针变量指向后一个数据元素的首地址,而不是原地址基础上加 1。两个指针变量之间的运算: 1)指针变量的加减法运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减运算是毫无意义的。2)只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。如 pf1 和 pf2 是指向同一浮点数组的两个指针变量,设 pf1 为 2010H,pf2 为
34、2000H,而浮点数每个元素占 4 字节,所以 pf1-pf2 的结果为(2010H-2000H)/4=4,表示 pf1 与 pf2 之间相差 4 个元素。两个指针变量不能进行加法运算。3)两指针变量进行关系运算,可以表示它们所指数组元素之间的关系。如 pf1=pf2 表示 pf1 和 pf2 指向同一数组元素;pf1>pf2 说明 pf1 处于高地址位置;p=0 说明 p 是空指针,它不指向任何变量;p!=0表示 p 不是空指针;空指针是对指针变量赋予 0 值而得到的。#define NULL 0 int *p=NULL;对指针变量赋 0 值和不赋值是不同的。指针变量未赋值时,可以是任
35、意值,不能使用。否则将造成意外错误。而指针变量赋 0 值后,则可以使用。(7)数组指针和指向数组指针的指针变量:理解该概念。通过指针引用数组元素可以采用下面的形式:若有数组 a10,则 p+i 和 a+i 就是 ai的地址,或者说它们指向 a 数组的第 i 个元素;*(p+i)或*(a+i)就是 p+i 或 a+i 所指向的数组元素,即 ai。pi与*(p+i)等价。在上面用到了 p 和 a,但是应该注意 p 和 a 是不同的,p 是变量,a 是常量。a+非法,p+合法。(8)*p+ 由于+与*同优先级,结合方向自右而左,等价于*(p+).*(p+)与*(+p)作用不同。若 p 初值为 a,前
36、者表示 a0,后者表示 a1.(*p)+表示 p 所指向的元素加 1。(9)指向多为数组的指针和指针变量。ai=*(a+i),对二维数组来说 ai+j=*(a+i)+j.由于*(a+i)+j是二维数组 a 的 i 行 j 列元素的首地址,所以,该元素的值等于*(*(a+i)+j)。二维数组指针变量说明的一般形式为:类型说明符 (*指针变量名)长度长度表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。注意()不能少,缺少括号则表示是指针数组。(10)在 C 语言中,有两种方法访问一个字符串。1)用字符数组存放一个字符串,然后输出该字符串。如 char string=&quo
37、t;I love China!" printf("%sn",string);string 是数组名,它代表字符数组的首地址。2)用字符串指针指向一个字符串。如 char *string="I love China!"可以用指针加方括号表示数组元素。如 char st20,*ps; ps=st; 则 psi表示 sti。字符串指针变量与字符数组的区别:首先字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是以该地址为首的一块连续的内存空间并 以'0'作为结束标志。字符数组是由若干个元素组成的,它可以用来存放整个字符
38、串,如 char *ps; ps="C Language"是可以的,而 char st20; st="C Language"是不行的,只能对字符数组的各元素逐个赋值。(11)函数指针变量 类型说明符 (*指针变量名)();指针变量值为函数入口地址,类型说明符指明函数的返回值的类型。(*指针变量名)表示*后面的变量是定义的指针变量,这里的*不能理解为求值运算,在此处它只是一种表示符号。最后的空括号标志指针变量所指是一个函数。应用方式:int max(int a,intb);int (*pmax)();pmax=max;z=(*pmax)(x,y);把被调用
39、函数的入口地址(函数名)赋予给函数指针变量,用函数指针变量形式调用函数,形式为:(*指针变量名)(实参表)。(12)指针型函数类型说明符 *函数名(形参表)/*函数体*/函数的返回值是一个指针。区别:int (*p)() 和 int *p()(13)指针数组类型说明符 *数组名数组长度通常可以用一个指针数组来指向一个二维数组。指针数组也常用来表示一组字符串,应用例子如下:main()static char *name="Illegalday","Monday","Tuesday","Wednesday","
40、;Thursday","Friday","Saturday","Sunday"char *ps;int i;char *day_name(char *name,int n);printf("input Day No:n");scanf("%d",&i);if(i<0) exit(1);ps=day_name(name,i);printf("Day No:%2d->%sn",i,ps);char *day_name(char *name,int n
41、)char *pp1,*pp2; pp1=*name;pp2=*(name+n);return(n<1|n>7)?pp1:pp2);(15)指向指针型数据的指针变量定义形式:eg:char *p;应用例子:main()char *name="follow me","BASIC","Great Wall","Computer"char *p;int i;for(i=0;i<4;i+)p=name+i;printf("%sn",*p);十二、结构体和共用体(1)结构体的定义形式:S
42、truct 结构名成员列表变量名列表;eg:struct stuint num;char name20;char sex;float score;struct data birthday;boy1,boy2,boy5;struct dataint month;int day;int year;结构体变量的定义可以直接在声明结构体之后定义,也可以按照普通方法定义。结构体支持嵌套,成员变量也可以是结构体。一般使用中可以用宏定义一个符号常量来表示一个结构类型,如#define STU struct stu。结构体也可以定义数组,上面 boy5就是一个数组。注意:结构名在定义时候系统并不会给结构体分配
43、内存,只有定义了结构体变量之后才会被分配内存空间。(2)结构体变量成员的访问形式结构体变量.成员名eg:boy1.num; boy1.birthday.month;(3)结构体变量的初始化赋值方法1)采用一般赋值的方法进行赋值。2)boy1=102,"Zhu Dan",'M',80,1,28,1987; (4)结构指针变量struct 结构名 *结构指针变量名对结构指针变量的赋值要把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。eg:pstu=&boy1。访问形式有两种:(*结构指针变量).成员名 或 结构指针变量->成员名eg:
44、 (*pstu).num; 或 pstu->num;注意*pstu 两侧的括号不能少,因为成员符.的优先级高于*。结构指针变量同样可以用于指向结构体数组,同样可以用作函数参数。ANSI C 标准中允许用结构体变量作函数参数进行整体传送,但是这种传送要将全部成员逐个传送,特别是成员为数组时传送的时间和空间开销相当大,严重地降低了程序的效率,因此,最好的办法就是使用指针,即使用指针变量作函数参数进行传送,这时由实参传向形参的只是地址,从而减小了时间和空间开销。(5)动态存储分配c 语言中不允许动态数组类型,如 scanf("%d",&n);int an;是错误的。
45、实际应用中往往有这种动态分配的需要。 C 语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间。1)(类型说明符*)malloc(size)功能:在内存的动态存储区分配一块长度为 size 字节的连续区域,函数返回值为该区域的首地址。eg:pc=(char *)malloc(100);pc 为指针。2)(类型说明符*)calloc(n,size)功能:在内存动态存储区中分配 n 块长度为 size 字节的连续区域。函数返回值为该区域首地址。eg:ps=(struct stu*)calloc(2,sizeof(struct stu);。 3)free(void*ptr)功能:释放 ptr 所指向的一块内存空间,ptr 可以是任意类型的指针变量。被释放区域应是被 malloc 或 calloc 函数所分配的区域。eg:free(ps);(6)链表使用动态分配内存,每个节点之间可以是不连续的,节点之间的连接可以通过指针实现。每个节点有两部分,数据域和指针域。第一个节点的指针域存入第二个节点的首地址,第二个节点的指针域存入第三个节点的首地址,如此下去,最后一个节点的指针域赋 0 值。这种数据结构就称为“链表”。基本操作包括:建立链表;结构的查找与输出;插入一个节点;删除一个节
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐饮常识培训体系构建
- 口腔护理刷牙顺序规范
- 解除合伙协议协议书
- 足球发展框架协议书
- 食堂共管账户协议书
- 鲁南地质工程协议书
- 露天采矿承包协议书
- 购销合同变更协议书
- 防汛物质供货协议书
- 重庆股权转让协议书
- WS∕T 391-2024 CT检查操作规程
- JTG-T-F20-2015公路路面基层施工技术细则
- 低压电涌保护器(SPD) 第12部分:低压电源系统的电涌保护器选择和使用导则
- 《巴以冲突》课件
- (高清版)WST 442-2024 临床实验室生物安全指南
- ISO-1183密度不确定度报告
- 2023-2024学年上海市一年级下册期末数学调研试卷(含答案)
- 外科护理疑难病例个案
- 语文园地八 日积月累《大林寺桃花》(课件)2023-2024学年统编版语文三年级下册
- 如何搞好基层武装工作
- 铁路政治思想培训课件
评论
0/150
提交评论