C语言读书重点笔记_第1页
C语言读书重点笔记_第2页
C语言读书重点笔记_第3页
C语言读书重点笔记_第4页
C语言读书重点笔记_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第一章概述

I.C语言特点

①语言简洁、紧凑,使用以便、灵活。共有32个核心字,9种控制语句。

②运算符丰富,公有34种运算符。

③数据构造丰富,数据类型有:整型、实型、字符型、数组、指针、构造体、共用体等。

④具备构造化控制语句(如if...else、while、do...while、switch>for)

⑤语法限制不太严格,程序设计自由度大。

⑥容许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。

⑦生成目的代码质量高,程序执行效率高。

⑧可移植性好.

2.C语言用途:K(7j-b,I

C虽不擅长科学计算和管理领域,但对操作系统和系统实用程序以及对硬件进行操作方面,

c有明显优势。当前诸多大型应用软件也用C编写。

第二章数据类型、运算符与表达式

I.C数据类型

C数据类型涉及:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、

构造体类型、共用体类型、指针类型和空类型。

2.常量与变量

常量其值不可变化,符号常量名通惯用大写。变量其值可以变化,变量名只能由字母、数字

和下划线构成,且第一种字符必要为字母或下划线。否则为不合法变量名。变量在编译时为

其分派相应存储单元。

3.整型数据

整型常量表达办法:十进制不用说了,八进制以0开头,如0123,十六进制以Ox开头,如

0x1Co

整型变量分为:基本型(int)、短整型(shortint)、长整型(longint)和无符号型。不同机

器上各类数据所占内存字节数不同,普通血型为2个字节,long型为4个字节。

4.实型数据

实型常量表达形式:十进制形式由数字和小数点构成(必要有小数点),如:0.12、.123、123.、

0.0等。指数形式如123式代表123x10三次方。

实型变量分为单精度(float)和双精度(double)两类。在普通系统中float型占4字可,7

位有效数字,double型占8字节,15~16位有效数字。

5.字符型数据:.B7@/r(m-a

字符变量用单引号括起来,如工b等。尚有某些是特殊字符常量,如,n「r等。分别代表换

行和横向跳格。:U6Vu%F8l/x)a

字符变量以char来定义,一种变量只能存储一种字符常量。

字符串常量是由双引号括起来字符序列。这里一定要注意言和“a"不同,前者为字符常量,

后者为字符串常量,c规定:每个字符串结尾加一种结束标志XX,事实上包括两个字符:

然和

6.数值型数据间混合运算.:X/{/d"10'(h

整型、字符型、实型数据诃可以混合运算,运算时不同类型数据要转换成同一类型再运算,

转换规则:

char,short->int->unsigned->long->double<-float

7.运算符和表达式:6N3c(b.n4z

c运算符涉及:

算数运算符(+-*/%)!S{(s-C6N^R

关系运算符(><==>=<=!=)a)Kx%m,A6B

逻辑运算符(!&&||)

位运算符(《>>~|八&)

赋值运算符(=)

条件运算符(?:)05E:j2X5wlY:Y3s9Y5|5L

逗号运算符(,)

指针运算符(*&)

求字节数(sizeof)

强制类型转换(类型)R-05p!I:GQln-g

分量运算符(.>)A/Y2h(0#N)q!V'p

下标运算符(U)

其他运算符(如函数调用运算符())

自增自减运算符(++—)注意:++i和i++不同之处,++i使用i之前先使i力口1,i++使

用i之后,使i加1。

逗号表达式求解过程:先求解表达式1,再求解表达式2,整个表达式值是表达式2值。

第三章最简朴c程序设计

1.c9种控制语句:

if()~else-

for()~

while()~

do-while()

continue

break

switch

goto

return

程序三种基本构造:顺序构造,选取构造,循环构造

2.数据输出

C语言不提供输入输出语句,输入输出操作是由C库函数完毕。但要包括头文献stdioh。

putchar()向终端输出一种字符

printfO格式字符:

①d格式符用来输出十进制整数rzc()TO1

%d按整型数据实际长度输出

%md使输出长度为m,如果数据长度不大于m,则左补空格,如果不不大于m,则输出实

际长度

%ld输出长整型数据

②。格式符以八进制形式输出整数

③x格式符以十六进制形式输出整数

④u格式符用来输出unsigned型数据,以十进制形式输出

⑤c格式符用来输出一种字符

⑥s格式符输出一种字符串

%s输出实际长度字符串

%ms输出串占m歹ij,如果串长度不大于m,左补空格,如果不不大于m,实际输出

%-ms输出串占m歹ij,如果串长度不大于m,右补空格,

%m.ns输出占m列,但只取字符串中左端n个字符并靠右对齐

%-m.nsm、n含义同上,靠左对齐,如果n>m,则m自动取n值

⑦f格式符以小数形式输出实数

%f整数某些所有输出,小数某些输出6位

%m.nf输出数据共占m歹],其中有n位小数。如果数值长度不大于m,左补空格

%-m.nf同上,右补空格

⑧e格式符以指数形式输出实数

%e系统指定6位小数,5位指数(e+002)

⑨g格式符输出实数,依照数值大小,自动选f格式或e格式「S():q'T,o!v9E

3.数据输入J-Z-V

getchar()从终端输入一种字符

scanf(格式控制,地址列表)原则Cscanf中不使用%山对于unsigned型数据,以%4或%0

或%*输入。%后水,用来跳过它相应数据。输入数据时不能规定精度如scanf("%7.2F,&a);

是不合法。

第四章逻辑运算和判断选用控制

1.关系运算符:

c提供6种关系运算符(><<=>===!=)前四种优先级高于后两种。SN7@--6x2v&P,

2.If语句

C提供了三种形式if语句

If(表达式)语句

If(表达式)语句1else语句2

I0(表达式1)语句1

Elseif(表达式2)语句2

else语句n

3.条件运算符“RC

(a>b)?a:b条件为真,表达式取值a,否则取值b

4.Switch语句

Switch(表达式)

{:-9A-Q

case常量表达式1:语句1;break;

case常量表达式2:语句2;break;

case常量表达式n:语句n;break;

default:语句n4-1;

\Ooly;y+t

第五章循环控制

1.几种循环语句

goto语句(现已很少使用)

while语句先判断表达式后执行语句

do-while语句先执行语句后判断表达式

for语句

2.Break语句和continue语句

Break语句用于跳出循环,continue用于结束本次循环。

第六章数组

I.一维数组b&e'a!r.A4\)x-M)B

c规定只有静态存储(static)和外部存储(extern)数组才干初始化。给数组初始化时可以

不指定数组长度。mlz5C-A9i-14i!P

2.二维数组5q9w3A.z6A8T$M(p

3.字符数组

某些字符串解决函数A*',G)b!1/1V7e

puts(字符数组)将一种字符串输出到终端。-ZDU;y-s'h8x

gets(字符数组)从终端输入一种字符串到字符数组,并且得到一种函数值,为该字符数组首

地址

strcat(字符数组1,字符数组2)连接两个字符数组中字符串,数组1必要足够大。

Strcpy(字符数组1,字符串2)将字符串2拷贝到字符数组1中。

Strcmp(字符串1,字符串2]比较字符串,相等返回0,字符串1>字符串2,返回正数,不大

于返回负数。

Strlen(字符数组)求字符吊长度。

Strlwr(字符串)将字符串中大写字母转换成小写

Strupr(字符串)将字符串中小写字母转换成大写

以上是某些比较惯用字符串解决函数。

第七章函数HOG2@!N;S

1.关于形参和实参阐明

①在函数被调用之前,形参不占内存

②实参可以是常量、变量或表达式

③必要指定形参类型

④实参加形参类型应一致

⑤实参对形参数据传递是“值传递”,即单向传递

2.函数返回值

如果想让函数返回一种值,在函数中就要用reuirn语句来获得,在定义函数时也要对函数值

指定类型,如果不指定,默认返回整型。q()N4III

3.函数调用

1)注旨在函数调用时实参加形参个数、类型应一一相应。对实参表求值顺序是不拟定,有系

统按自左至右,有系统则按自右至左顺序。这一点要注意。

2)函数调用方式:函数语句,函数表达式,函数参数

3)如果主调函数和被调函数在同一文献中,并且主调函数在前,那么普通要在主调函数中对

被调函数进行阐明。除非:(1)被调函数返回值类型为整型或字符型(2)被调函数出当前主调

函数之前。

4)对函数阐明和定义是不同,定义是指对函数功能确立,涉及指定函数名,函数值类型,形

参及其类型、函数体等。阐明则只是对已定义函数返回值类型进行阐明,只涉及函数名、函

数类型以及一种空括弧,不涉及形参和函数体。

5)c语言容许函数递归调用(在调用一种函数过程中乂浮现直接或间接调用该函数自身)。

4.数组作为函数参数

I)数组元素作为函数参数和普通变量相似

2)数组名作参数应当在主调和被调函数分别定义数组,形参数组大小可以不定义。注意:数

组名作参数,不是单向传递。X6Y%7./L4X7gST8-!P8k

3)多维数组作参数,在被调函数中对形参数组定义时可以省略第一维大小阐明,但不能省略

第二维或更高维阐明。

5.局部变量和全局变量

从变量作用域角度分,变量可分为局部变量和全局变量。

I)内部变量(局部变量)

在一种函数内定义,只在函数范畴内有效变量。

2)外部变量(全局变量)

在函数外定义,可觉得本文献其他函数所共用,有效范晡从定义变量位置开始

到本文献结束,建议尽量少使用全局变量,由于它在程序所有执行过程中都占用

资源,并且使函数通用性减少了。如果在定义外部变量之前函数要想使用该

外部变量,则应在该函数中用extern作外部变量阐明。

6.动态存储变量与静态存储变量

从变量值存在时间(生存期)角度来分,可分为静态存储变量和动态存储变量。静态存储指

在程序运营期间给变量分派固定存储空间,动态存储指程序运营期间依照需要动态给变量分

派存储空间。

C语言中,变量存储办法分为两大类:静态存储类和动态存储类,详细涉及:自动(auto),

静态(static),寄存器(register),外敞extern)。

1)局部变量存储方式

函数中局部变量如不作专门阐明,都之auto,即动态存储,auio可以省略。局部变量也可以

定义为static,这时它在函数内值是不变。静态局部变量如不赋初值,编译时系统自动赋值

为0,动态局部变量如不赋初值,则它值是个不拟定值。C规定,只有在定义全局变量和局

部静态变量时才干对数组赋初值。为提高执行效率,c容许将局部变量值放在寄存器中,

这种变量叫register变量,要用register阐明。但只有局部动态变量和形式参数可以作为

register变量,其他不行。

2)全局变量存储方式

全局变量在函数外部定义,编译时分派在静态存储区,可以在程序中各个函数所引用。各

种文献状况如何引用全局变量呢?如果在一种文献定义全局变量,在别文献引用,就要在

此文献中用extern对全局变量阐明,但如果全局变量定义时用static话,此全局变量就只能

在本文献中引用了,而不能被其他文献引用。

3)存储类别小结

从作用域角度分,有局部变量和全局变量

局部变量:自动变量,即动态局部变量(离开函数,值就消失)

静态局部变量(离开函数,值仍保存)

寄存器变量(离开函数,值就消失))、4Sll:X:Y#l

(形参可定义为自动变量和寄存器变量)

全局变量:静态全局变量(只限本文献引用)

全局变量(容许其他文献引用)

从存在时间分,有静态存储和动态存储

动态存储:自动变量(本函数内有效)

寄存器变量(本函数内有效)

形参

静态存储:静态局部变量(函数内有效)

静态全局变量(本文献内有效)

全局变量(其他文献可引用)111-N/M3N01

从变量值存储位置分

静态存储区:静态局部变量

静态全局变量

全局变量

动态存储区:自动变量和形参

寄存器内:寄存器变量

7.内部函数和外部函数

内部函数:只能被本文献中其他函数调用,定义时前加static,内部函数乂称静态函数。

外部函数:可以被其他文献调用,定义时前加extern,如果省略,则隐含为外部函数,在需

要调用此函数文献中,普通要用exiern阐明。

第八章预编译解决

c编译系统在对程序进行普通编译之前,先进行预解决。c提供预解决功能重要有如下三种:

I)宏定义2)文献包括3)条件编译

1.宏定义14D(@:N/A1(

不带参数宏定义

用一种指定标记符来代表一种字符吊,形式:#define标记符字符串

几点阐明:'IR.R2R3w4w

1)宏名普通用大写

2)宏定义不作语法检查,只有在编译被宏展开后源程序时才会报错

3)宏定义不是c语句,不在行末加分号

4)宏名有效范畴为定义到本源文献结束

5)可以用#undef命令终结宏定义作用域

6)在宏定义时,可以引用已定义宏名

带参数宏定义

定义形式:#define宏名〔参数表)字符串

这和函数有些类似,但她们是不同:

1)函数调用时,先求实参表达式值,再代入形参,而宏只是简朴替代,并不求值

2)函数调用是在程序运营时分派内存,而宏展开时并不分派内存,也没有返回值概念

3)对函数中实参和形参都要定义类型,并且规定一致,宏名无类型,其参数也没有类型。

4)函数只有一种返回值,而宏可以得到几种成果

5)宏替代不占运营时间,只占编译时间,而函数调用占运营时间

2.文献包括解决H6c9m

#include"文献1”就是将文献1所有内容复制插入到#include位置,作为一种源文献进行编

译。@8Y9L$Z%M$n8o7J-Q+M

在#加11也命令中,文献名可以用"”也可以用v>,如果当前filel.c中包括file2.h文献,“”

表达系统先在filel.c所在目录中找file2.h,如果找不到,再按系统指定原则方式检索目录,

<>表达系统直接按指定原则方式检索H录。因此用”“保险一点。

3.条件编译

条件编译指不对整个程序都编译,而是编译满足条件那某些。条件编译有如下几种形式:

I)#ifdef标记符

程序段1

#else

程序段2

#endif

它作用:当标记符在前面已经被定义过(普通用#define),则对程序段1编译,否则对程序

段2编译。-yl[/j-R9r9|3q"n

2)#ifndef标记符

程序段

#else

程序段2

#endif

它作用和用£°1d'相反,当标记符没被定义过,对程序段1编译,否则对程序段2编译。

3)#if表达式

程序段1H%b+x3R6\v:T.a)@2W9w7w

#else

程序段2v#P7J+t;P;y#F!i

#endif

它作用:当表达式值为真(非0)时,对程序段1编译,否则对程序段2编译。

第九章指针

指针说白了就是地址,指针变量就是用来存储指针(地址)变量。

I.变量指针和指向变量指针变量

读起来很拗口,说白了就是变量地址和用来存储变量地址地址变量。由于一种变量在编译时

候系统要为它分派一种地址,如果再用一种变量来存储这个地址,那么这个变量就叫做指

向变量指针变量,也就是用来存储变量地址这样一种变量。所谓“指向”就是指存储xx地址,

如指向变量指针变量,“指向”就是指用来存储变量地址,再如指向数组指针变量,“指向”

就是指存储数组地址。只要理解了这个,指针也就不难了。此外,尚有指向字符串指针变量,

指向函数指针变量,指向指针指针变量等。

1)指针变量定义

形式:类型标记符*标记符$11:int*pointer;

要注意两点:*表达pointer是个指针变量,在用这个变量时候不能写成*pointer,"pointer

是pointer指向变量。一种指针变量只能指向同一种类型变量。如上面

pointer只能指向int型变量。

2)指针变量引用

两个关于运算符:

&取地址运算符&a就代表变量a地址

*指针运算符*a就代表变量a值

2.数组指针和指向数组指针变量

数组指针指数组起始地址,数组元素指针指数组元索地址。

1)指向数组元素指针变量定义与赋值

定义和指向变量指针变量定义相似,c规定数组名代表数组首地址,即第一种数组元素地址。

2)通过指针引用数组元素

咱们普通引用数组元素形式是a,如果用指针可以这样引用,*(〃+",或定义一种指针变量

P,将数组。首地址赋给p,p=a;然后用引用。

注意:指针变量P指向数组a首地址,则p++指向数组a下一元素地址,即31]地址.

3)数组名作函数参数

形参数组和实参数组之间并不是值传递,而是共用同一段地址,因此在函数调用过程中如果

形参值发生变化,则实参值也跟着变化。

4)指向多维数组指针和指针变量

以二维数组为居多。假设定义了一种二维数组73M41,那么

a代友整个二维数组首地址,也代我第0行首地址,同步也是第0行第0列元素首地址。。+0

和30]代表第0行首地址,«+/和代表第一行首地址。\)7S.I:{-bBd

假设。是一种数组首地址,那么如果。是一维,a+1代表第I个元素地址,如果a是二维,

则代表第I行首地址,

那么第一行第二列元素地址如何表达呢?a[l]+2或&〃〃/2/或*m+/)+2。

咱们只要记住:在二维数组中a代表整个数组首地址,“1]代表第1行首地址,0〃与找+〃

等价就行了。只要运用纯熟了就没什么复杂了。

5)指向由m个整数构成一维数组指针变量

iihini(*p)[4J,p是一种指向包括4个元素一维数组,如果p先指向a[0],则p+1指向a[l],

即p增值是以一维数组长度为单位,这里是4,举个例子:

假设川3][4]=〃,3,579,1113,15,17,19,21,23},p先指向G[0]也就是数组。首地址,那么p+1

就是31]首地址即元素9地址,由于在定义p时定义一维数组长度为4,因此

P+1就等于加了一种一维数组长度4。

3.字符串指针和指向字符串指针变量

D字符串表达形式

c中字符串有两种表达形式:一种是数组,一种是字符指针

charstringfJ="Ilovec!";

char*str="Ilovec!";

其实指针形式也是在内存中开辟了一种数组,只但是数组首地址存储在字符指针变量和中,

千万不要以为str是一种字符串变量。

2)字符串指针作函数参数

事实上字符串指针就是数组首地址。

3)字符指针变量与字符数组区别

①字符数组由若干元素构成,每个元素存储一种字符,而字符指针变量只存储字符串首地

址,不是整个字符串

②对数组初始化要用staM,对指针变量不用。

③对字符数组赋值,只能对各个元素赋值,不能象下面这样:

charstr[14];

str="1loved";

对指针变量可以,

char

str="Ilovec!";

注意:此时赋给於不是字符,而是字符串首地址。

@数组在定义和编译时分派内存单元,而指针变量定义后最佳将其初始化,否则指针变量

值会指向一种不拟定内存段,将会破坏程序。如:

char

sccmfi"%s"fa);这种办法是很危险,应当这样:

char*a,strflO];

a=str;

scanfl"%s",a);这样字符指针就指向了一种拟定内存段。

@指针变量值是可以变化,而字符数组名所代表字符串首地址却是不能变化。

4.函数指针和指向函数指针变量

一种函数在编译时被分派一个入口地址,这个入口地址就称为函数指针。函数名代表函数

入口地址,这一点和数组同样。咱们可以用一种指针变量来存储这个入口地址,然后通过该

指针变量调用函数。如:假设有一种求两者较大函数如下:intimx,inty);

当咱们调用这个函数时可以这样:

intc;

c=max(a,b);这是普通调用办法,其实咱们可以定义一种函数指针,通过指针来调用,如:

加“*p始;〃注意指向函数指针变量定义形式

p=max;〃此句就是将函数入口地址赋给函数指针变量p

c=(*p)(a,b);

有些朋友可能对LpK)不大理解,其实它意思就是定义一种指向函数指针变量p,p不是固

定指向哪个函数,而是专门用来存储函数入口地址变量。在程序中把哪个函数入口地址赋

给它,它就指向哪个函数。但要注意,p不能象指向变量指针变量同样进行p++,p-等无意义

操作。

既然P是一种指针变量,那么就可以作为函数参数进行传递。其实函数指针变量最惯用用途

之一就是作为函数参数传递到其他函数。这也是C语言中应用比较进一步某些了。

5.返回指针值函数

咱们懂得,一种函数可以带回一种整型值、字符值、实型值等,函数还可以带回一种指针型

数据,即地址。这种函数定义形式如下:

类型标记符字函数名(参数表)如:int*a(x,y)返回一种指向整型指针

使用这种函数时候要注意:在调用时要先定义一种恰当指针来接受函数返回值。这个恰当指

针其类型应为函数返回指针所指向类型。

这样函数比较难于理解,其实只要把它当做普通函数来解决就容易了。当咱们觉得指针难于

理解时候,就把它暂时当做整型来看,就好理解多了。

6.指针数组

指针数组无疑就是数组元素为指针,定义形式为:类型标记/数组名[数组长度]

如:int*p[4],千万不要写成讪(邓)[41,这是指向一维数组指针变量。指针数组多用于存储

若干个字符串首地址,注意一点,在定义指针数组时初始化,如下:

staticchar*name[J=l"Lijing","Wangmi","Xushang

不要觉得数组中存储是字符串,它存储是字符串首地址,这一点一定要注意。

7.指向指针指针

阐明白一点,将一种指针再用一种变量来存储,那么这个变量就是指向指针指针。定义如:

char**p;

8.指针数组作main。函数参数!Z'^j8-9\

函数形式为

mam(hitargc,char*argvf]){)

main函数参数是从命令行得到,argc指命令行参数个数,注意命令名也算一种参数,命令

行参数都是字符串,她们苜地址构成一种指针数组⑴冲。Main函数形参用argc和arg2只是

一种习惯,也可以定义成别名字。

9.指针小结「J&G!J

D关于指针数据类型

定乂畲乂

hit/;定义一种整型变量1

/,"*〃:P为指向整型数据指针变量

IntalnJ;定义整型数组a,它有n个元素

Int*pf〃J;定义指针数组p,它有n个指向整型指针元素

hit(*p)fn];P为指向具有n个元素一维数组指针变量

F为返回整型值函数

P为返回值为指针函数,该指针指向整型数据

IntP为指向函数指针,该函数返回一种整型值

/〃/**〃;定义一种指向指针指针变量

2)ANSl新增了一种void*•指针类型,即定义一种指针变量,但不指向任何数据类型,等用届

时候再强制转换类型。如:

char*p/;

void*p2;

pl=(char*)p2;

也可以将一种函数定义成void*型,如:

void*fun(chi,ch2)

表达函数fun返回一种地址,它指向空类型,如果需要用到此地址,也要对其强制转换。如

(假设pl为char蛰):

pl-(char*)fun(cJ,c2);

指针应当说是c语言中比较重要概念,也是c语言精华,它有诸多长处,但用不好也会带来

严重性错误,这就需要咱们多用,多练,慢慢枳累经验.

第十章构造体与共用体

1.定义

构造体定义普通形式:OO?IW7F5-3c4J0

struct构造体名{

成员列表

};

定义一种构造体变量可以这样定义:struct构造体名构造体变量名;

2.构造体变量引用

在引用构造体变量时应注意如下规则:

D不能将构造体变量作为一种整体输入输出,只能对变量当中各个成员输入输出。新原贝叱

容许将一种构造体变量直接赋值给另一种具备相似构造构造体变量。

3.构造体变量初始化

如:

structstudent

{longintnum;

charname[20];

charsex;

charaddr[2()];

la=l8903h"LiLin",'M\"123BeijingRoad");

4.构造体数组

structstudentstu[4];

定义了一种数组Stu,其元素为stmctswdent类型,数组有4个元素。注意数组各元素在内

存中是持续存储。

在定义构造体数组时,数组元素个数可以不指定。编译时,系统会依照给出初值构造体常量

个数来拟定数组元素个数。

5.指向构造体变量指针

由于构造体变量在内存中是持续存储各成员,因而咱们可以将构造体变量在内存中起始地址

存储到一种变量中,那么这个变量就是指向构造体变量指针。

注意将构造体变量首地址赋给指针变量形式:

structstudentstu_l;

structstudent*p;

p=&stu_l;〃要加取地址符而指向函数和指向字符串指针不用

在对引用构造体变量中成员时,有三种方式:

以上面构造体为例:设p为指向此构造体变量指针,即p=&a;

I)a.num

2)(*p).num

3)p->num

6.指向构造体数组指针Z}K-s:j3JK/P

structstudent*p;

structstudentstu[4];

p=stu;

则p为指向构造体数组指针变量。这里应注意P++,p指向stu[0],p++则指向SN[1]。P指

向是数组中i种元素苴地址,而不能让p指向元素中某一成员,如是不对。

7.用指向构造体指针作函数参数

虽然ANSIC容许用整个构造体作为函数参数,但要将所有成员值一种一种传递,开销大。

因此用指针作参数,能提高运营效率。

Structstudentstu;

用整个构造体作为参数调用形式:

fun(stu);

并且被调函数fun中也要定义成构造体变量Snictstudentstu;

用指针作参数调用形式:

fiin(&stu);

被调函数fun中定义成指针变量,s"i(ctstudent*p;

8.用指针解决链表

链表是一种重要数据构造,因素就在于它可以动态进行存储分派。链表均有一种头指针,用

来存储整个链表首地址。链表定义形式如下:

structnode{

intnum;

structnode*next;

I;

next用来存储下'节点地址。

如何进行动态开辟和释放存储单元呢?c提供了如下关于函数:

I)malloc(size)在内存动态存储区开辟一种长度为size持续空间。成功返I可々间苜地址,失

败返回。;

2)calloc(n,size)在内存动态存储区开辟n个长度为size持续空间。成功返回空间首地址,失

败返回0;

3)free(ptr)释放由ptr指向内存区。P"是近来调用一次调用mallocfOcalloc时返回值。

上面函数中,n和size为整型,plr为字符指针。

9.共用体

定义形式:

union共用体名

{1S2X-Z5m%J'U

成员列表

}变量列表;-k:IVR5W/s;P4u%j3l%q

共用体和构造体类似,只是有一点不同,构造体中个成员起始地址不同,构造体变量在内存

中长度为各成员长度之和;而共用体中个成员起始地址相似,共用体变量所占内存长度为最

长成员长度。ct6f3()w9/)k9z

共用体类型数据特点:

I)同一种内存段可以存储几种不同类型成员

2)共用体变量中起作用成员是最后一次存储成员

3)不能对共用体变量名赋值,不能在定义时初始化。

4)不能把共用体变量作为函数参数

5)共用体类型可以出当前构造体定义中,反之也可,也可以定义共用体数组。

此外,构造体名可以作为参数,而共用体名不可以。

这两中数据构造在不同场合中各有所用。10,枚举类型

定义形式如下:举个例子

enumweekday{sun,mon,tue,wed,thu,fri,sat};

enumweekdayworkday,week_end:〃定义枚举变量

workdayweek_end被定义成枚举类型,她们值只能为到sat之一。

也可以直接定义枚举变量,这一点与构造体相似

enumweekdayfsun,mon,me,wed,thu,fri,sat}wordday,week_end;

注意:枚举元素是作为常量存在,她们是有值,c在编译时使她们值按顺序为0,1,2…

如:上面定义中,sun值为0,mon值为1

此外:虽然枚举元素有值,但不能将一种整数直接赋给一种枚举变量。应进行强制类型转换,

如:

workday=(enumweekday)2;它相称于把me赋给了workdayo

11.用typedef定义类型

typedef作用就是可以让你定义一种自己喜欢数据类型名来代替已有数据类型名。如:

typedefintlNT;那么我就用以用1NT来定义整型变量了。作用和int同样。

Typede于用于构造体定义,如:

Typedefstruct{

Intday;

Intmonth;

Intyear;

/DATE;

DATEbirthday;

DATE*p;等等

用typedef有助于程序通用与移植。

第十一章位运算

1)概述

所渭位运算是指进行二进制位运算。在系统软件中,常要解决二进制位问题。

c提供位运算符有::4Z3Q(Y)L

&按位与

I按位或

门按位异或—

~取反—Y$,fH:Q

«左移

»右移

&对于将一种单元清零、取一种数中某些指定位以及俣存指定位有很大用途。

I常被用来将一种数某些位置/.

人判断两个位值,不同为1,相似为0。惯用来使特定位翻转等。

~惯用来配合其他位运算符使用,惯用来设立屏蔽字。

<<将-•种数各二进制位所有左移,高位左移后溢出,舍克不起作用。左移一位相称于该数

乘2,左移n位相称于乘2〃。左移比乘法运算要快多。

>>右移时,要注意符号问题。对无符号数,右移时左边高位移入0,对于有符号数,如果

本来符号位为0(正数),则左边移入0;如果符号位为I(负数),则左边移入0还是1要

取决于系统。移入0称为'逻辑右移移入1称为'算数右移二

2)位段

将一种字节分为几段来存储几种信息。所谓位段是以位为单位定义长度构造体类型中成员。

如:

structpacked-data{

unsigneda:2;

unsignedb:6;

unsignedc:4:

unsignedd:4;

bit/;

}data;

其中a,b,c,d分别占2位,6位4位,4位。I为整型,占4个字节。

对于位段成员引用如下:

data。=2;等,但要注意赋值时,不要超过位段定义范畴。如位段成员a定义为2位,最大

值为3,即⑴)2,因此data.a=5;就会取5两个低位进行赋值,就得不到想要值了。

关于位段定义和引用,有几点重要阐明:,/〃仆V匕T2F.P6p()n3p

①若某一种段要从另一种字开始存储,可以定义:

unsigneda:1;

unsignedb:2;

unsigned:0;

unsignedc:3;(另一单元)

使用长度为0位段,作用就是使下一种位段从下一种存储单元开始存储。

②一种位段必要存储在用•种存储单元中,不能跨两个单元。

③可以定义无名位段。如:

unsigneda:1;

im§igned:2;(这两位空间不用)

unsignedb:3;

④位段长度不能不不大于存储单元长度,也不能定义位段数组。

第十二章文献

I)概述

C语言将文献当作一种字符序列,分为ASCII文献(文本文献)和二进制文献。即一种c文

献就是一种字节流或二进制流。

ASCH文献每一种字节放一种ASCII码,代表一种字符,输出与字符一一相应,便于逐个解

决字符,但占用空间较多。二进制文献按内存中存储形式原样输出到磁盘上,节约空间,

由于输出与字符不相应,不能直接输出字符形式,普通用于保存中间成果。当前c对文献解

决只有缓冲文献系统一种办法,即无论是从程序到磁盘文献还是从磁盘文献到程序,数据

都要先通过缓冲区,待缓冲区布满后,才集中发送。

2)文献夹类型指针hlQ.aS7R--K

在缓冲文献系统中,核心概念是文献指针。由于每个被使用文献都在内存中开辟一种缓冲区,

来存储文献关于信息。这些信息保存在一种构造体变量中,该构造体类型是由系统定义,取

名为FILE,在sidio.h中建义。

FILE*fp;

定义了一种文献指针变量fp,后来对文献操作都是通过fp进行。

3)文献打开与关闭

在对文献读写之前,要先打开文献。

打开文献函数为:fopen(),调用方式为:

FILE陟;

fp~fopen(filename,使用文献方式);

fopen()失败返回一种空指针NULL,成功则返回-一种指向"filename"文献指针,赋给fp,这样

加就和打开文献联系在一起了。或者说,力指向了节lename”。

文献使用方式:r,w,a,rb,wb,ab,r+,w+,a+,rb+fwb+,ab+,详细含义要记住。

4)文献关闭

为了防止数据丢失,程序结束前,务必将打开文献关诩,即

温馨提示

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

评论

0/150

提交评论