当前位置:首页 >> IT/计算机 >>

C语言专升本辅导(整理)


2008年专升本辅导

C语言程序设计

考试要求
1. 对 C 语言的语法、语义有较好的理解。 2. 能熟练地阅读 C 源程序,并具有初步分析程序 的能力。 3. 初步掌握结构化程序设计的方法和技巧,能从 分析问题入手,设计可行的算法,进而用 C 语言 编写结构良好的面向过程的程序。 4. 通过上机实验,掌握程序的调试和测试方法。

考题类型 ? 选择题(概念、语法等): 60% ? 程序阅读题: 20% ? 程序设计题(或程序填空): 20% 参考用书 《程序设计基础》,张杰敏编,高等教育出版社出版 《 C 语言程序设计》,谭浩强编,清华大学出版社出版

第一章 C语言概述
C语言发展历史与特点(了解) C程序格式和结构特点(掌握) TC 环境下 C 程序的上机步骤(掌握)

结构特点
函数与主函数
程序由一个或多个函数组成 必须有且只能有一个主函数main() 程序执行从main开始,在main中结束,其它函数通过嵌 套调用得以执行。

程序语句
C程序由语句组成 用“;”作为语句终止符 /* */为注释,不能嵌套 不产生编译代码

非法

注释 例: /*This is the main /* of example1.1*/ */

编译预处理命令

C程序的上机步骤

编辑 编译 链接 执行

程序代码的录入, 生成源程序*.c 语法分析查错,翻译 生成目标程序*.obj 与其它目标程序或库 链接装配,生成可执行 程序*.exe

第二章 算法
? 算法的概念(理解) ? 算法的表示方法(了解) ? 组成结构化程序的三种基本结构(理解) ? 结构化程序设计的过程(了解)

算法——操作步骤 解决: 解决 做什么? 怎么做?

有限的操作步骤且每一步均应在合 算法的特点 理的时间内完成,无“死循环”

有穷性 确定性

每一条指令必须有确定的含 义,无“二义性”
有多种输入途径可供输入数据,以 进行数据处理

可行性/有效性 有零个或多个输入 有一个或多个输出

每一步骤通过已经实现的基 本运算执行后,在有限次内 得到有效的效果,无“死语 句”

有多种输出途径 可将运行结果输 出

算法的表示方法
自然语言 流程图 N-S流程图 伪代码 计算机程序语言

第三章 数据类型、运算符与表达式
? C 语言中数据类型的分类(了解) ? 整型、实型、字符型、字符串常量的表示方法(掌握) ? 符号常量的定义和使用(掌握) ? 变量的定义、初始化(掌握) ? 算术、赋值、复合赋值、自增、自减、逗号运算符及表 达式(掌握) ? 各类数值型数据间的混合运算(掌握)

预备知识
计算机中数的表示及进制转换
各种进制之间的转换
二进制、八进制、十六进制转换成十进制

字节和位
内存以字节为单元组成 每个字节有一个地址 一个字节一般由8个二进制位组成 每个二进位的值是0或1

数值的表示方法——原码、反码和补码
原码:最高位为符号位,其余各位为数值本身的绝对值 反码:
正数:反码与原码相同 负数:符号位为1,其余位对原码取反

补码:
正数:原码、反码、补码相同 负数:最高位为1,其余位为原码取反,再对整个数加1

基本数据类型

常量与变量
标识符
定义:用来标识变量名、常量名、函数名、数组名、 类型名和文件名等的字符序列 组成:
只能由字母、数字、下划线组成,且第一个字符必须是字母 或下划线 大小写敏感 不能使用关键字

长度:TC-最长32个字符;MS C-最长8个字符

字符常量 定义:用单引号括起来的单个普通字符或转义字符. 字符常量的值:该字符的ASCII码值
转义字符及其含义:
转义字符

如 ‘A’——65, ‘a’——97, ‘0’——48 , ‘\n’——10

转义字符:反斜线后面跟一个字符或一个代码值表示
含义 换行 垂直制表 回车 响铃 单引号 转义字符 含义 水平制表 退格 换页 反斜线 双引号 2位16进制数代表的字符

\n \v \r \a \‘
\ddd

\t \b \f \\ \“
\xhh

3位8进制数代表的字符

例 转义字符举例 main() { printf("\101 \x42 C\n"); printf("I say:\"How are you?\"\n"); printf("\\C Program\\\n"); printf("Turbo \'C\'"); }

整型变量
占字节数随机器不同而不同,一般占一个机器字 short≤int≤long 可用sizeof(类型标识符)测量

实型变量
float:占4字节,提供7位有效数字 double:占8字节,提供16位有效数字

字符型变量
字符变量存放字符ASCII码 char与int数据间可进行算术运算
例 float a; a=111111.111; double b; b=111111.111; 例 /* a=111111.1*/ /* b=111111.111*/ a=‘D’; x=‘A’+5; s=‘!’+‘G’ /* a=68; */ /* x=65+5; */ /* s=33+71; */

没有字符串变量,用字符数组存放



double

float

说明: 必定的转换

long 运算对象类型不同时转换 unsigned



int

char,short

显式转换(强制转换)
一般形式:(类型名)(表达式) 例 (int)(x+y) (int)x+y (double)(3/2) (int)3.6 说明:强制转换得到所需类型的中间变量,原变 量类型不变 精度损失问题 例 main() { float x; 较高类型向较低类型转换时可能发生 int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); } 结果:x=3.600000,i=3

学习运算符应注意:
运算符功能 与运算量关系
要求运算量个数 要求运算量类型

运算符优先级别 结合方向 结果的类型

短路特性:逻辑表达式求解时,并非所有的逻辑运算符 都被执行,只是在必须执行下一个逻辑运算符才能求出 表达式的解时,才执行该运算符

第四章 数据输入与输出
? 赋值语句及使用(掌握) ? 字符输入输出( getchar函数和putchar函数)(了解) ? 格式输入输出( scanf函数和printf函数)(掌握)

格式字符:

d x,X o u c s e,E f g %%
说明

十进制整数 十六进制无符号整数 八进制无符号整数 不带符号十进制整数 单一字符 字符串 指数形式浮点小数 小数形式浮点小数 e和f中较短一种 百分号本身

int a=567;printf ( “%d”,a);
int a=255;printf(“%x”,a);

567 ff 101 567 A ABC 5.677890e+02 567.789000 567.789 %

int a=65;printf(“%o”,a); int a=567;printf(“%u”,a); char a=65;printf(“%c”,a); printf(“%s”,“ABC”); float a=567.789;printf(“%e”,a); float a=567.789;printf(“%f”,a); float a=567.789;printf(“%g”,a); printf(“%%”); 例

格式字符要用小写 格式字符与输出项个数应相同,按先后顺序一一对 应 输出转换:格式字符与输出项类型不一致,自动按指 定格式输出

int a=3,b=4; printf(“%d %d\n”,a,b); printf(“a=%d , b=%d\n”,a,b);

例 main() { unsigned int u=65535; printf(”u=%d\n",u); } 输出结果:u=-1

例 int a=3,b=4; printf(“%d %d\n”,a,b); printf(“a=%d , b=%d\n”,a,b); 输出结果: 3 4 a=3, b=4

附加格式说明符(修饰符)

附加格式说明符(修饰符)

例 scanf(“%2d%*3d%2d”,&a,&b); 输入 1234567? 则12?a, 67?b 例 scanf(“%3c%2c”,&c1,&c2); 输入 abcde ? 则‘a’?c1, ‘d’ ?c2 例 scanf(“%4d%2d%2d”,&yy,&mm,&dd); 输入 19991015 ? 则1999?yy, 10 ?mm, 15 ?dd

例 scanf(“%3d%*4d%f”,&k,&f); 输入 12345678765.43? 则123?k, 8765.43?f

输入分隔符的指定 一般以空格、TAB或回车键作为分隔符 其它字符做分隔符:格式串中两个格式符间字符

例 scanf(“%d%o%x”,&a,&b,&c); 例printf(“a=%d,b=%d,c=%d\n”,a,b,c); scanf(“%d:%d:%d”,&h,&m,&s); 输入 123 123 123? 输入 12:30:45? 则12 ?h, 30 ?m, 45 ?s 输出 a=123,b=83,c=291 例 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); 输入 a=12,b=24,c=36 ? 例 scanf(“%d,%d”,&a,&b) 输入 3,4 ? 则3?a, 4 ?b

说明:
用“%c”格式符时,空格和转义字符作为有效字符输入



scanf(“%c%c%c”,&c1, &c2,&c3); 输入数据时,遇以下情况认为该数据结束: 若输入abc? 遇空格、TAB、或回车 如 scanf(“%d%c%f”,&a,&b,&c); 则a?c1, ?c2, b ?c3 遇宽度结束 若输入1234a123o.26 ? 遇非法输入 则 1234 ?a, ‘a’ ?b, 123 ?c 输入函数留下的“垃圾”:

例 int x; char ch; scanf(“%d”,&x); ch=getchar(); printf(“x=%d,ch=%d\n”,x,ch); 执行:123? 输出:x=123,ch=10

例 int x; char ch; scanf(“%d”,&x); scanf(“%c”,&ch); printf(“x=%d,ch=%d\n”,x,ch); 执行:123? 输出:x=123,ch=10

例 int x; char ch; scanf(“%d”,&x); scanf(“ %c”,&ch); 或 scanf(“%*c%c”,&ch);

第五/六章 C程序流程设计
第五章 选择结构 ? 关系、逻辑运算符及表达式(掌握) ? if 语句的三种形式(掌握) ? switch 语句及 break 语句的使用 (掌握) ? 要求能编写含有 if 语句嵌套结构的程序 要求 第六章 循环结构 ? while 语句及应用(掌握) ? do-while 语句及应用(掌握) ? for 语句及应用(掌握) ? break 语句在循环中的作用(掌握) ? continue 语句在循环中的作用(了解) ? 要求 要求能编写含有二重循环结构的程序。

C语句分类

程序控制语句(9种):
if( )~else~ switch for( )~ 循环 while( )~ do~while( ) continue break 辅助控制 goto return
分支

复合语句:用 {…}括起来的一组语句 一般形式: { [数据说明部分;] 执行语句部分; } 说明: “}”后不加分号 语法上和单一语句相同 复合语句可嵌套

说明: for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分 号;不可省 无限循环: for(;;) for语句可以转换成while结构 例 用for循环求

#include <stdio.h> main() { int i,sum=0; for(i=1;i<=100;i++) sum+=i; printf("%d",sum); }

expr1; while(expr2) { 循环体语句; expr3; }

例:#include<stdio.h> 例:#include<stdio.h> main( ) main( ) { int i=0; { int i=0; for(;i<10;i++) for(i=0;i<10;i++) putchar(‘a’+i); putchar(‘a’+i); } } 例:#include<stdio.h> 例:#include<stdio.h> main( main( ) ) { { int i=0; int i=0; for(;i<10;) for(;i<10;putchar(‘a’+i),i++) 结果:abcdefghij ; putchar(‘a’+(i++)); } }

第七章 数组
? 一维数组的定义、初始化及元素引用(掌握) ? 二维数组的定义、初始化及元素引用(掌握) ? 字符数组的定义及使用(掌握) ? 字符串处理函数(了解)

例 int i=15; int data[i];

(×不能用变量定义数组维数)

例 int data[5]; data[5]=10; 意

//C语言对数组不作越界检查,使用时要 注

一维数组的引用
数组必须先定义,后使用 只能逐个引用数组元素,不能一次引用整个数组 数组元素表示形式: 数组名[下标] 其中:下标可以是常量或整型表达式 例 int a[10]; printf(“%d”,a); (×) 必须 for(j=0;j<10;j++) printf(“%d\t”,a[j]);

( )

一维数组的初始化 初始化方式

int a[5]={1,2,3,4,5}; 等价于:a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; 在定义数组时,为数组元素赋初值 (在编译阶段使之得到初值)

说明: 数组不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值 只给部分数组元素赋初值 当全部数组元素赋初值时,可不指定数组长度

如 int a[5]={6,2,3}; (不用static初值也可为0) 等价于: a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0; 如 int a[3]={6,2,3,5,1}; (×) int a[]={1,2,3,4,5,6}; 编译系统根据初值个数确定数组维数

static int a[5]; 等价于:a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0;

二维数组元素的初始化 分行初始化: 二维数组元素的引用 形式: 数组名[下标][下标]

按元素排列顺序初始化 例 int a[2][3]={1,2,3,4,5,6};

全部初始化

1

2

3

4

5

6

a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
第一维长度省略初始化

例 int a[][3]={1,2,3,4,5};
1 2 3 4 5 0

a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

字符数组和字符串 字符数组 定义

例 char c[10], ch[3][4];

字符数组的初始化 逐个字符赋值 用字符串常量 字符数组的引用

用字符串常量

例 char ch[6]={“Hello”}; char ch[6]=“Hello”; char ch[]=“Hello”;

H

e

l

l

o

\0

ch[0] ch[1] ch[2] ch[3] ch[4] ch[5]

例 char diamond[][5]={{'.', '.','*'},{'.','*','.','*'}, {'*', '.', '.', '.' ,'*'},{'.','*', '.','*'},{'.', '.','*'}};

diamond[0] diamond[1] diamond[2] diamond[3] diamond[4]

. . * . .

. * . * .

* . . . *

\0 * . * \0

\0 \0 * \0 \0

二维字符数组初始化

例 char fruit[][7]={“Apple”,”Orange”, ”Grape”,”Pear”,”Peach”};

fruit[0] A fruit[1] O fruit[2] G fruit[3] P fruit[4] P

p r r e e

p a a a a

l n p r c

e g e \0 h

\0 e \0 \0 \0

\0 \0 \0 \0 \0

字符串的输入输出 逐个字符I/O: %c 整个字符串I/O: %s 例 用%c main() { char str[5]; int i; for(i=0;i<5;i++) scanf(“%c”, &str[i]); for(i=0;i<5;i++) printf(“%c”, str[i]); 例 用%s } main() { char str[5]; 用字符数组名, scanf(“%s”, str); 遇‘\0’结束 printf(“%s”, str);
}

用字符数组名,不要加& 输入串长度<数组维数 遇空格或回车结束 自动加‘\0’

例 对于以下字符串,strlen(s)的值为: (1)char s[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’}; (2)char s[ ]=“\t\v\\\0will\n”; (3)char s[ ]=“\x69\082\n”;

第八章 函数
? 函数的定义与调用(掌握) ? 函数调用时的实参与形参的结合(掌握) ? 函数原型声明与函数在源程序中的相对位置的关系(理解) ? 函数的嵌套调用和递归调用(理解) ? 局部变量和全局变量的概念及应用(理解 ) ? 变量的存储类别 auto 、 static 、 register 、 extern (了解)

函数的定义
一般格式
现代风格:

函数返回值类型 缺省int型 无返回值void

合法标识符

函数类型 函数名(形参类型说明表) { 说明部分 语句部分 }

函数体

例 有参函数(现代风格) int max(int x,int y) { int z; z=x>y?x:y; 例 有参函数(现代风格) return(z); int max(int x, y) } { int z; z=x>y?x:y; return(z); }

例 无参函数 printstar( ) { printf(“**********\n”); } 或 printstar(void ) { printf(“**********\n”); }

函数的返回值 返回语句 形式: return(表达式); 或 return 表达式; 或 return; 功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数 说明: 函数中可有多个return语句 若无return语句,遇}时,自动返回调用函数 若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换------函数调用转换 main() void型函数

例 无返回值函数 void swap(int x,int y ) { int temp; temp=x; x=y; y=temp; }

{ float a,b; int c; scanf("%f,%f",&a,&b); c=max(a,b); printf("Max is %d\n",c); } max(float x, float y) { float z; z=x>y?x:y; return(z); }

函数的调用
调用形式
函数名(实参表); 说明:
实参与形参个数相等,类型一致,按顺序一一对应 实参表求值顺序,因系统而定(Turbo C 自右向左)

例 函数说明举例
/*ch7_5.c*/ float add(float x, float y) { float z; z=x+y; return(z); } main() { float a,b,c; scanf("%f,%f",&a,&b); c=add(a,b); printf("sum is %f",c); }
main() { float a,b; int c; scanf("%f,%f",&a,&b); c=max(a,b); printf("Max is %d\n",c); } max(float x, float y) { float z; z=x>y?x:y; return(z); }

被调函数出现在主调函数 之前,不必函数说明
/*ch7_5.c*/ main() { float add(float,float); /*function declaration*/ float a,b,c; scanf("%f,%f",&a,&b); c=add(a,b); printf("sum is %f",c); } float add(float x, float y) { float z; z=x+y; return(z); }

int型函数可不作函数说明 (Borland C++不行)

例 交换两个数

例 求二维数组中最大元素值

例 不同函数中同名变量 main() { int a,b; a=3; b=4; printf("main:a=%d,b=%d\n",a,b); sub(); printf("main:a=%d,b=%d\n",a,b); } sub() { int a,b; a=6; b=7; printf("sub:a=%d,b=%d\n",a,b); }

例 复合语句中变量

#define N 5 main() { int i; int a[N]={1,2,3,4,5}; for(i=0;i<N/2;i++) { int temp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp; } for(i=0;i<N;i++) printf("%d ",a[i]); }

float f1(int a) { int b,c; ……. } char f2(int x,int y) { int i,j; …… } main() { int m,n; ……. }

a,b,c有效

x,y,i,j有效

m,n有效

扩 展 后 后 展



c1,c2 c1,c2 的 的 作 作 用 用 范 范 围 围

int p=1,q=5; extern char c1,c2; float f1(int a) { int b,c; extern char c1,c2; ……. } int f3() {….. } char c1,c2; char f2(int x,int y) { int i,j; …… } main() { int m,n; ……. }

p,q的作用范围

c1,c2的作用范围

第九章 预处理命令
? #define 命令的使用(理解) ? #include 命令的作用(了解)

宏定义 不带参数宏定义 一般形式: #define 宏名 [宏体] 功能:用指定标识符(宏名)代替字符序列(宏体) 定义位置:任意(一般在函数外面) 作用域:从定义命令到文件结束 #undef可终止宏名作用域 格式: #undef 宏名 宏展开:预编译时,用宏体替换宏名---不作语法检查 宏定义可嵌套,不能递 归 例 #define MAX 如 MAX+10

宏体可缺省,表示宏名 定义过或取消宏体

(×)

if(x==YES) printf(“correct!\n”); else if (x==NO) printf(“error!\n”); 展开后: if(x==1) printf(“correct!\n”); else if (x==0) printf(“error!\n”); 宏定义中使用必要的括号() 引号中的内容与宏名相同也不置换 例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2; 宏展开:var= 80+40 *2;

例 #define YES 1 main() { …….. } #undef YES #define YES 0 max() {…….. }

YES原作用域

YES新作用域

例 #define WIDTH 80 #define LENGTH (WIDTH+40) var=LENGTH*2; ) 宏展开:var= (80+40 *2;
例 #define PI 3.14159 printf(“2*PI=%f\n”,PI*2); 宏展开:printf(“2*PI=%f\n”,3.14159*2);

文件包含
<> 直接按标准目录搜索 功能:一个源文件可将另一个源文件的内容全部 “” 先在当前目录搜索,再搜索标准目录 包含进来 可指定路径 一般形式: #include “文件名” 或 #include <文件名> 处理过程:预编译时,用被包含文件的内容取代 该预处理命令,再对“包含”后的文件作一个源 文件编译

第十章 指针
? 地址、指针、指针变量的概念(掌握) ? 指针变量的定义、初始化、赋值(掌握) ? 两个与指针有关的运算符( & 和 * )(掌握) ? 指针和一维数组的关系(掌握) ? 指针和二维数组的关系(了解) ? 指针和字符串的关系(掌握) ? 参数为指针类型的函数应用(掌握) ? 指针数组和指向指针的指针(了解)

&与*运算符
含义
含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左

两者关系:互为逆运算 理解 含义: 取指针所指向变量的内容 单目运算符 优先级: 2 结合性:自右向左

i_pointer &i_pointer 2000 整型变量i
i_pointer &i &(*i_pointer) i *i_pointer *(&i)

*i_pointer 10 i

…...

2000 2001 2002 2003 2004 2005 2006 …... 2000

10

变量i_pointer 指针变量

i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i)

i_pointer-----指针变量,它的内容是地址量 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址

指针变量 指针变量与其所指向的变量之间的关系 例 int *p1,*p2; float *q ; static char *name;

i_pointer 2000

变量i 3 *i_pointer

i &i i=3;

*i_pointer i_pointer *i_pointer=3

指针变量的定义
一般形式: [存储类型] 数据类型 *指针名;
合法标识符

指针的目标变量的数据类型 指针变量本身的存储类型 注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值

表示定义指针变量 不是‘*’运算符

指针变量的初始化
一般形式:[存储类型] 数据类型 *指针名=初始地址值; 例 例 int i; int *p=&i; 赋给指针变量, 不是赋给目标变量
变量必须已说明过 类型应一致 用已初始化指针变量作初值 例 int *p=&i; int i;

int i; int *p=&i; int *q=p;

例 main( ) { int i; static int *p=&i; .............. } (×)

不能用auto变量的地址 去初始化static型指针

一级指针变量与一维数组的关系
int *p 与 int q[10] 数组名是指针(地址)常量 p=q; p+i 是q[i]的地址 数组元素的表示方法:下标法和指针法, 即若p=q, 则 p[i] ? q[i] ? *(p+i) ? *(q+i) 形参数组实质上是指针变量,即int q[ ] ? int *q 在定义指针变量(不是形参)时,不能把int *p 写成int p[]; 系统只给p分配能保存一个指针值的内存区(一般2字节);而给 q分配2*10字节的内存区

指针与二维数组
二维数组的地址
array 对于一维数组: (1)数组名array表示数组的首地址,即array[0]的地址; (2)数组名array是地址常量 (3)array+i是元素array[i]的地址 (4)array[i] ? *(array+i) int array[10];

指针与字符串
字符串表示形式
用字符数组实现 例 main( ) { char string[]=“I love China!”; printf(“%s\n”,string); printf(“%s\n”,string+7); }
string I l o v e C h i n a ! \0 string[0] string[1] string[2] string[3] string[4] string[5] string[6] string[7] string[8] string[9] string[10] string[11] string[12] string[13]

用字符指针实现 string 字符指针初始化:把字符串首地址赋给string ? char *string; string=“I love China!”; 例 main( ) { char *string=“I love China!”; string printf(“%s\n”,string); string+=7; *string!=0 while(*string) { putchar(string[0]); string++; } }

I l o v e C h i n a ! \0

字符串指针作函数参数 例 用函数调用实现字符串复制 (1)用字符数组作参数 (2)用字符指针变量作参数
void copy_string(char from[],char to[]) { int i=0; while(from[i]!='\0') { to[i]=from[i]; i++; } to[i]='\0'; } main() { char a[]="I am a teacher."; char b[]="You are a student."; printf("string_a=%s\n string_b=%s\n",a,b); copy_string(a,b); printf("\nstring_a=%s\nstring_b=%s\n",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=%s\nstring_b=%s\n",a,b); copy_string(a,b); printf("\nstring_a=%s\nstring_b=%s\n",a,b); }

a from

a I a m a t e a c h e r . \0

b to

b y o u a r e a s t u d e n t . \0

I a m a t e a c h e r . \0 t . \0

指针数组和多级指针
用于处理二维数组或多个字符串 指针本身的存储类型 指针数组
指针所指向变量的数据类型

定义:数组中的元素为指针变量 定义形式:[存储类型] 数据类型 *数组名[数组长度说明]; 例 int *p[4]; 区分int *p[4]与int (*p)[4] int *pb[2] 指针数组赋值与初始化 初始化: main() { int b[2][3],*pb[ ]={b[0],b[1]}; …….. } 赋值: main() { int b[2][3],*pb[2]; pb[0]=b[0]; pb[1]=b[1]; …….. }

int b[2][3] 1 2 3 2 4 6

pb[0] pb[1]

int *pb[2] pb[0] pb[1]

int b[2][3] 1 2 3 2 4 6

二维数组存储空间固定 字符指针数组相当于可变列长的二维数组 分配内存单元=数组维数*2+各字符串长度

指针数组元素的作用相当于二维数组的行名 但指针数组中元素是指针变量 二维数组的行名是地址常量

定义形式:[存储类型] 数据类型 **指针名; 如 char **p;

*p是p间接指向对象的地址 最终目标变量的数据类型 指针本身的存储类型 例 int i=3; **p是p间接指向对象的值 int *p1; i 3 **p2, *p1 int **p2; &i p1 *p2 p1=&i; &p1 p2 p2=&p1; **p=5; 例 int i, **p; p=&i; (×)//p是二级指针,不能用变量地址为其赋值 多级指针 例 三级指针 四级指针 int ***p; char ****p;

第十一章 结构体、共用体 和枚举类型
? 结构体类型的定义(掌握) ? 结构体变量、数组、指针变量的定义、初始化 及成员引用(掌握) ? 参数为结构体变量或结构体指针的函数(理解) ? 共用体的概念及共用体类型的定义(了解) ? 枚举类型的概念及共用体类型的定义(理解) ? typedef 语句的使用(了解)

结构体变量的定义
先定义结构体类型,再定义结构体变量
一般形式:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }; struct 结构体名 变量名表列; 例 #define STUDENT struct student STUDENT { int num; char name[20]; char sex; int age; float score; char addr[30]; }; STUDENT stu1,stu2;

例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; struct student stu1,stu2;

说明 结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆 结构体类型及变量的作用域与生存期

例 struct student { int num; char name[20]; struct date { int month; int day; int year; }birthday; }stu;

num

name

birthday
month day year

例 struct date { int month; int day; int year; }; struct student { int num; char name[20]; struct date birthday; }stu;

num

name month

birthday day year

结构体变量的引用 引用规则

成员(分量)运算符 优先级: 1 结合性:从左向右

结构体变量不能整体引用,只能引用变量成员 引用方式: 结构体变量名.成员名 可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用



struct student { int num; char name[20]; printf(“%d,%s,%c,%d,%f,%s\n”,s char sex; tu1); (×) int age; float score; char addr[30]; stu1={101,“Wan Lin”,‘M’,19,87.5,“DaLian”}; (×) }stu1,stu2;

例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;

stu2=stu1;

(

)

例 struct student { int num; char name[20]; struct date { int month; int day; int year; }birthday; }stu1,stu2;

stu1.birthday.month=12;

num

name

birthday month day year

例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;

if(stu1==stu2) …….. (×)

结构体数组
结构体数组的定义
三种形式:
形式一: struct student { int num; char name[20]; char sex; int age; }; struct student stu[2]; 形式二: struct student { int num; char name[20]; char sex; int age; }stu[2];

num 25B name sex age num name sex age stu[1] stu[0]

形式三: struct { int num; char name[20]; char sex; int age; }stu[2];

结构体数组初始化 结构体数组引用
引用方式: 结构体数组名[下标].成员名

例 struct { int num; char name[20]; char sex; int age; }stu[ ]={{……},{……},{……}}; 分行初始化: struct student { int num; char name[20]; char sex; int age; }; struct student stu[ ]={{100,“Wang Lin”,‘M’,20}, {101,“Li Gang”,‘M’,19}, {110,“Liu Yan”,‘F’,19}};

顺序初始化: struct student { int num; char name[20]; char sex; int age; }; struct student stu[ ]={100,“Wang Lin”,‘M’,20, 101,“Li Gang”,‘M’,19, 110,“Liu Yan”,‘F’,19};
stu[1].age++;

struct student { int num; char name[20]; char sex; int age; }str[3];

全部初始化时维数可省

strcpy(stu[0].name ,”ZhaoDa”);

例 struct student { int num; char name[20]; char sex; int age; }stu[ ]={{……},{……},{……}};

结构体和指针 指向结构体变量的指针 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p; 使用结构体指针变量引用成员形式 (*结构体指针名).成员名 例 指向结构体的指针变量
main() { struct student { long int num; char name[20]; char sex; float score; }stu_1,*p; p=&stu_1; stu_1.num=89101; strcpy(stu_1.name,"Li Lin"); p->sex='M'; p->score=89.5; printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n", (*p).num,p->name,stu_1.sex,p->score); }

存放结构体变量在内存的起始地址 指向运算符 优先级: 1 结合方向:从左向右

结构体指针名->成员名

结构体变量名.成员名
p num name sex age stu

struct student { int num; char name[20]; char sex; int age; }stu; struct student *p=&stu;

struct student stu1; struct student *p=&stu1; stu1.num=101; ? (*p).num=101

例 int n; int *p=&n; *p=10; ? n=10

指向结构体数组的指针
例 指向结构体数组的指针
num struct student name { int num; sex char name[20]; age p+1 char sex; int age; }stu[3]={{10101,"Li Lin",'M',18}, {10102,"Zhang Fun",'M',19}, {10104,"Wang Min",'F',20}}; main() { struct student *p; for(p=stu;p<stu+3;p++) printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age); } p stu[0]

stu[1]

stu[2]

用指向结构体的指针作函数参数
用结构体变量的成员作参数----值传递 用指向结构体变量或数组的指针作参数----地址传递 用结构体变量作参数----多值传递,效率低

共用体变量引用 引用方式: 共用体变量名.成员名 共用体指针名->成员名 引用规则 不能引用共用体变量,只能引用其成员 不能在定义共用体变量时初始化 共用体变量中起作用的成员是最后一次存放的成员 可以用一个共用体变量为另一个变量赋值 例 a.i=1; a.ch=‘a’; a.f=1.5; printf(“%d”,a.i); 例 union { int i; char ch; float f; }a={1,’a’,1.5}; 例 union { int i; char ch; float f; }a; a=1; (×) (*共用体指针名).成员名 例 float x; union { int i; char ch; float f; }a,b; a.i=1; a.ch=‘a’; a.f=1.5; b=a; (√) x=a.f; (√)

(×编译通过,运行结果不对) a.i a.ch union data { int i; char ch; float f; }; union data a,b,c,*p,d[3]; a.f

p->i p->ch p->f (*p).i (*p).ch (*p).f d[0].i d[0].ch d[0].f

(×)

用typedef定义类型
功能:用自定义名字为已有数据类型命名 类型定义简单形式: typedef type name;
例 typedef int INTEGER; 例 typedef float REAL; 类型定义后,与已有类型一样使用 例 INTEGER a,b,c; REAL f1,f2;
类型定义语句关键字 已有数据类型名 用户定义的类型名

说明: 1.typedef 没有创造新数据类型 2.typedef 是定义类型,不能定义变量 3.typedef 与 define 不同

define 预编译时处理 简单字符置换

typedef 编译时处理 为已有类型命名

int a,b,c; float f1,f2;

typedef定义类型步骤
按定义变量方法先写出定义体 如 将变量名换成新类型名 如 最前面加typedef 如 用新类型名定义变量 如 int i; int INTEGER; typedef int INTEGER; INTEGER i,j;

类型定义可嵌套

第十二章 文件
? 理解 C 文件的概念; ? 掌握文件类型指针的概念; ? 掌握文件的打开和关闭( fopen 函数和 fclose 函数); ? 了解文件的字符读写( fgetc 函数和 fputc 函数); ? 掌握文本文件的格式化读写( fscanf 函数和 fprintf 函数) ? 了解二进制文件的数据块读写( fread 函数和 fwrite 函数) ? 了解文件的定位( rewind 函数和 fseek 函数)

文件使用方式 “r/rb” (只读) “w/wb” (只写) “a/ab” (追加) “r+/rb+” (读写) “w+/wb+” (读写) “a+/ab+” (读写)

含义 为输入打开一个文本/二进制文件 为输出打开或建立一个文本/二进制文件 向文本/二进制文件尾追加数据 为读/写打开一个文本/二进制文件 为读/写建立一个文本/二进制文件 为读/写打开或建立一个文本/二进制文件

文件的打开与关闭 C文件操作用库函数实现,包含在stdio.h 文件使用方式:打开文件-->文件读/写-->关闭文件 系统自动打开和关闭三个标准文件: 例 FILE *fp; char *filename=“c:\\fengyi\\bkc\\test.dat” 标准输入------键盘 stdin fp= fopen(filename,”r”); 标准输出------显示器 stdout 标准出错输出-----显示器 stderr 使用文件方式 打开文件fopen 函数原型: FILE *fopen(char *name,char *mode)
功能:按指定方式打开文件 返值:正常打开,为指向文件结构体的指针;打开失败,为NULL

要打开的文件名

例 文件打开与测试 FILE *fp; fp=fopen(“aa.c”,“w”); if(fp==NULL) { printf(“File open error!\n”); exit(0); }

例 FILE *fp; fp= fopen (“c:\\fengyi\\bkc\\test.dat”,”r”);

文件指针

fseek函数 函数原型: int fseek(FILE *fp,long offset,int whence) 功能:改变文件位置指针的位置 返值:成功,返回0;失败,返回非0值

起始点 文件开始 文件当前位置 文件末尾

SEEK_SET 0 SEEK_CUR 1 SEEK_END 2

ftell函数 函数原型: long ftell(FILE *fp) 功能:返回位置指针当前位置(用相对文件开头的位移量表示) 返值:成功,返回当前位置指针位置;失败,返回-1L, 例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2);

位移量(以起始点为基点,移动的字节数) >0 向后移动 <0 向前移动


相关文章:
经典C语言用于专升本的好资料
C语言专升本辅导(整理) 228页 免费 10年C语言专升本100题 23页 免费 C语言专升本辅导 82页 2财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意...
专升本C语言各种程序
专升本C语言各种程序_计算机硬件及网络_IT/计算机_专业资料。1.m 个人的成绩...专升本C语言历年考试题及... 7页 免费 C语言专升本辅导 98页 5下载券 专升本...
2014专升本精通C语言精编100题(answer)
2014专升本学院C语言精编100题2014专升本学院C语言精编100题隐藏>> C 语言精编 100 题 C 语言精编 100 题一、单选题 1. 由 C 语言编写的代码程序( B ) A....
专升本C语言历年考试题及答案8[1]
专升本 C 语言历年考试题及答案 江西财经大学 2005 年 专升本选拔考试《C 语言程序设计》试卷 (考试时间 120 分钟,总分 100 分) 一、用C语言描述下列命题(共 ...
专升本C语言模拟题_附答案
C语言专升本辅导 98页 5财富值 C语言专升本辅导 75页 1财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
专升本C语言复答案
专升本C语言复答案_经济学_高等教育_教育专区。辽工软件学院 2014 年专升本 C 语言复习题 一、选择题(共 50 题) 1.B 2. D 3. D 4. C 5. B 6.D ...
C语言程序设计(专升本)试卷附答案
专升本C语言程序设计试卷j... 9页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
C语言专升本3程序改错题(3月10日终版)
C语言专升本3程序改错题(3月10日终版)_专升本_成人教育_教育专区。C语言专升本计算机程序设计基础(c 语言) 习题 程序改错 计算机程序设计基础(C 语言) 程序改错练...
专升本C语言练习册答案补充
4页 免费 C语言专升本辅导 98页 5财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
专升本C语言教案习题
C语言专升本辅导 98页 2下载券 专升本C语言历年考试题及... 13页 免费 专升本C语言历年考试题及... 7页 免费 专升本C语言历年考试题及... 4页 免费专...
更多相关标签: