史上最全C语言学习笔记

最全C语言学习笔记

学习目标

学习编程最主要目标

分析问题的能力构造算法的能力编程的能力调试程序的能力

学习方法手段

如何操作?
解题思路:重点要放在解题的思路上
一开始就要学会看懂程序,编写简单的程序,然后逐步深入
语法细节是需要经过长期的实践才能熟练掌握
既要掌握概念,又必须动手编程,还要亲自上机运行调试
要举一反三——学习程序设计主要是掌握程序设计的思路与方法。在以后需要的时候能很快地掌握其它新的语言进行编程。
要提倡与培养创新精神。

了解计算机语言的发展历史

机器语言
符号语言——汇编程序转为机器语言
高级语言——编译程序转为机器语言(源程序-目标程序)

高级语言的发展阶段 :
1-非结构化的语言(程序难以阅读与维护)
2-结构化语言(为解决非结构化语言的缺点,提出了“结构化程序设计方法”,规定程序必须具有良好的特性与基本结构(顺序结构、分支结构、循环结构)构成,程序中的流程不允许随意跳转,程序总是由上而下顺序执行各个基本结构。这种程序结构清晰、易于编写阅读与维护。
——以上两种都是基于过程的语言,编写小程序时还能得心应手,但在处理较大规模的程序时就显得捉襟见肘
3-面向对象的语言 近十多年来,在处理较大规模的问题时,开始使用面向对象的语言。

程序设计的步骤:

1: 问题分析
2:设计算法
3:编写程序
4:运行程序,分析结果
5: 编写程序文档

C语言的特点

1:C语言是一种高级的结构化编程语言
2:语言简洁、紧凑、使用方便、灵活
3:运算符号丰富(34种运算符号)
4:数据类型丰富(整形、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型等)
5:具有结构化的控制语句(如if`···else语句、while语句、do···while语句、switch语句和for语句)
6:语法限制不太严格,程序设计自由度大
7:c语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此c语言既具有高级语言的功能,又具有低级语言的许多功能,可以用来编写系统软件。
8:用c语言编写的程序可移植性好。
9:生成目标代码质量高,程序执行效率高。

C语言程序的结构


一个程序由一个或者多个源程序文件组成。
在一个源程序文件中可以包括3个部分:
1:预处理指令
2:全局声明:(函数之外进行的数据声明,函数外面声明的变量称为全局变量,如果实在程序开头(定义函数变量之前)声明的变量,则在整个源程序范围内有效,在函数中声明的变量是局部变量,只是在函数范围内有效。)
3:函数定义:每个函数用来实现一定的功能,程序通过调用这些函数来实现功能。

函数——C程序的主要组成部分

1:程序的几乎全部工作都是由各个函数分别完成的,函数是程序的基本单位,在设计良好的程序中,每个函数都用来实现一个或者几个特殊的功能。编写c程序的主要工作就是编写一个个函数。

2:一个c语言程序是由一个或者多个函数组成的,其中必须包含一个main函数(且只能有一个main函数)。
3:在程序中被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编制设计的程序。
4:一个函数包括2个部分
函数的首部
函数体(声明部分、执行部分)
不论main函数在整个程序中位置如何,函数总是从main函数开始执行的。
程序中对计算机的操作是由函数中的c语句完成的。
在每个数据声明和语句的最后必须有一个分号。
有的语句功能c语言本身并不提供,利用库函数实现相应功能。
应当养成注释的好习惯,增加程序的可读性。

运行c程序的步骤与方法:

1:上机输入和编辑源程序
2:对源程序进行编译
3:进行连接处理
4:运行可执行程序,得到运行结果

C程序是模块化编程的

如果一个小程序只包含一个源程序文件,当程序规模较大时,所包含的函数数量较多,如果把所有的函数都放在同一个源程序文件中,则文件显得太大,不便于编译与调试。为了便于调试管理,可以使一个程序包含若干个源程序文件,每个源程序文件又包含若干个函数;一个源程序文件就是一个程序模块,即将一个程序分为若干个程序模块。
在进行编译时是以源程序文件为对象进行的。在分别对各源程序文件进行编译并得到相应的目标程序后,再将这些程序连接成一个统一的二进制的可执行的程序。——这种特点使得C语言程序其易实现程序的模块化

C语言数据的表现形式

常量(在程序的运行过程中,其值不能改变的量)

1-整型常量
2-实型常量—1:十进制小数形式 2:指数形式
3-字符常量—1:普通字符 2:转义字符
注释:水平制表符号\t相当于使数字向后移动了8个字符的位置。
4-字符串常量:单撇号只能扩一个字符、双撇号可以扩全部字符
5-符号常量:用#define 指令,指定用一个符号名代表一个常量

变量(变量代表一个有名字的,具有特殊属性的一个存储单元)

变量必须先定义,然后再使用
常变量(有名字的不变量)
思考:字符常量与常变量的区别:符号常量是在预编译指令中定义,它不占用存储单元、而常变量是占用存储单元的

标识符(就是一个对象的名字)只能是数字、字母、下划线

在高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效序列统称为标识符。

C语言数据类型

1基本数据类型

整形类型

基本整形 int(在存储单元中用补码形式存放、负数补码按位取反加一)VC 4
短整型 short int VC 2字节 占用存储空间比int少,常用于较小数值的场合以节省空间。
长整型 long int VC 4字节 占用存储空间比int多,适用于较大数值的场合。
双长整型 long long int 8字节
无符号整形十进制用%u格式输出、有符号则用%d输出
字符型char (由于字符的代码是按整数形式存储的,所以C99把字符作为整数的一种

布尔型bool

浮点类型——(用来表示具有小数点的实数的)

单精度浮点型float(存储时分三部分:数符、小数)4字节
双精度浮点型double 8字节
长双精度型 long double
构造数据类型

枚举类型enum——是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.

使用格式:枚举类型放在窗体模块、标准模块或共用模块中的声明部分,通过enum语句来定义。

格式:
[public|private] enum name
member name[指定的值]
member name[指定的值]
……
End enum

public:表示该枚举类型在整个工程中都是可见的(缺省的)
private:表示枚举类型只在所声明的模块中是可见的。
Name: 枚举类型的名称。必须是一个合法的VB标识符,在定义该枚举类型的变量或参数时用该名称来指定类型.
Membername:指定该枚举类型的组成元素名称.
Constantexpression:枚举类型的组成元素的值.如果没有指定具体值,则所有赋的值或者是0或者比其直接前面的值大1.元素的值也可以是别的enum类型.VB中将枚举中的元素的值按长整数处理.如果将一个浮点数值赋给一个枚举中的元素,VB会将该值取整为最接近的长整数.

理解:枚举类型是一个集合,数组类型是一个相同类型值的集合。

数组类型([ ])

1.一维数组类型的定义格式
typedef 元素类型关键字 数组类型名 [常量表达式];
例如:
(1)typedef int vector[10];
第一条语句 定义了一个元素类型为int,含有10个元素的数组类型vector,若不使用typedef保留字,则就变成了数组定义,它只定义了一个元素类型为int、含有10个元素的数组vector。
这两种定义有着本质的区别
若不适用typedef定义的是数组vector,系统将为它分配有保存10个整数的存储单元,共40个字节的存储空间;
若使用 typedef定义的是数组类型vector,系统只是把该类型的有关信息登记下来,待以后利用该类型定义对象时使用,具体地说,就是把vector的元素类型int,类型长度10,类型名vec等登记下来,待以后定义vector类型的对象时使用。

(2) typedef char strings[80];
第二条语句 定义了一个元素类型为char,含有80个元素的数组类型strings,以后可以直接使用strings类型定义数组对象,每个数组对象的元素为char型,数组长度(即元素个数)为80。

(3) typedef short int array[N];
第三条语句 定义了一个元素类型为short int的含有N个元素(N为已定义的符号常量)的数组类型array,以后利用它可以直接定义该类型的对象,它是一个含有N个短整型元素的数组。

下面是利用上述类型定义对象的一些例子。
(1) vector v1,v2;
(2) strings s1,s2,s3=“define type”;
(3) array a={25,36,19,48,44,50}; //假定常量N≥6
第一条语句 定义了vector类型的两个对象v1和v2,每个对象都是vector类型的一个数组,每个数组由10个整型元素所组成。
第二条语句 定义了strings类型的三个对象s1,s2和s3,并且对s3进行了初始化,每个对象都是含有80个字符空间的数组。
第三条语句 定义了一个array类型的对象a,它是一个含有N个短整型元素的数组,该语句同时对数组a进行了初始化,使得a[0]~a[5]的元素值依次为25,36,19,48,44和50。

2.二维数组类型的定义格式
typedef <元素类型关键字><数组类型名>[<常量表达式1>][<常量表达式2>];
例如:
(1) typedef int matrix[5][5];
第一条语句 定义了含有5行5列共25个int型元素的数组类型matrix
(2) typedef char nameTable[10][NN];
第二条语句 定义了10行NN列共10NN个char型元素的数组类型nameTable
(3) typedef double DD[M+1][N+1];
第三条语句 定义了含有M+1行N+1列共(M+1)
(N+1)个double类型元素的数组类型DD。
利用这三个二维数组类型可以直接定义出相应的二维数组。如:
(1) matrix mx={{0}}; 定义了二维整型数组类型matrix的一个对象mx,该对象是一个5*5的二维整型数组,每个元素均被初始化为0

(2) nameTable nt={""}; //或使用等同的{{’\0’}}初始化 定义了二维字符数组类型nameTable 的一个二维字符数组nt,该数组中的每个元素均被初始化为空字符

(3) DD dd={{0.0}}; 定义了二维双精度数组类型DD的一个数组dd,它的每个元素均被初始化为0.0。

在typedef语句中,<元素类型关键字>可以是C++语言中预定义的任何一种数据类型,也可以是用户在前面已定义的任何一种数据类型,所以通过该语句定义的类型同样可以用在其后的typedef语句中。如:
(1) typedef vector vectorSet[20];
(2) vectorSet vs;
第一条语句 定义了元素类型为vector,元素个数为20的一个数组类型vectorSet
第二条语句 定义了数据类型为vectorSet的一个对象vs,该对象包含有20个类型为vector的元素,每个元素又包含有10个int类型的元素,所以整个数组共包含有20行10列共200个整数元素,它等同于对vs的如下定义:
int vs[20][10];
利用typedef语句同样可以定义更高维的数组类型,这里就不进行讨论了。
3. 对已有类型定义别名
利用typedef语句不仅能够定义数组类型,而且能够对已有类型定义出另一个类型名,以此作为原类型的一个别名。如:
(1) typedef int inData;
(2) typedef char chData;
(3) typedef char* chPointer;
第一条语句 对int类型定义了一个别名inData
第二条语句 对char类型定义了一个别名chData
第三条语句 对char类型(它是字符指针类型)定义了一个别名chPointer。
以后使用inData,chData和chPointer就如同分别使用int,char和char
一样,定义出相应的对象。如:
(1) inData x,y;
(2) inData a[5]={1,2,3,4,5};
(3) chData b1,b2=‘a’;
(4) chData c[10]=“char data”;
(5) chPointer p=0;
第一条语句 定义了inData(即int)型的两个变量x和y
第二条语句 定义了元素类型为int的一维数组a[5]并进行了初始化
第三条语句 定义了chData(即char)型的两个变量b1和b2,并把b2初始化为’a’
第四条语句 定义了一个字符数组c[10]并初始化为”char data”
第五条语句 定义了一个字符指针变量p,并初始化为0(即NULL)。类型(void)

指针类型*

结构体类型(struct)

struct Student//声明一个结构体类型Student
{
int num;//包括一个整型变量num
char name[20];//包括一个字符数组name,可以容纳20个字符
char sex;//包括一个字符变量sex
int age;//包括一个整型变量age
float score;//包括一个单精度型变量
char addr[30];//包括一个字符数组addr,可以容纳30个字符
};

这样,程序设计者就声明了一个新的结构体类型Student(struct是声明结构体类型时所必须使用的关键字,不能省略),它向编译系统声明: 这是一种结构体类型,它包括num, name, sex, age, score, addr等不同类型的数据项。应当说明Student是一个类型名,它和系统提供的标准类型(如int、char、float、double 一样,都可以用来定义变量,只不过结构体类型需要事先由用户自己声明而已。
一个结构体变量中可以存放一组关联的数据。

共用体类型(union)

空类型(void)

函数类型

说明
1:其中整型浮点型枚举变量的值都是数值,统称为算数类型算数类型和指针类型统称为纯量类型,因为其变量的值是以数字来表示的。枚举类型是程序中用户定义的整数类型。
2:数组类型和结构体类型统称组合类型
***结构体所占变量长度是各个成员所占长度之和,而共用体所占变量长度则是其中最长数值成员的长度。
3:共用体不属于组合类型,因为在同一时间内只有一个成员具有值。
4:函数类型用来定义函数,描述一个函数的接口,包括函数返回值的数据类型和参数的类型。
5:C编译系统将浮点型常量都作为双精度处理(分配8个字节)

C语言算数运算符和表达式

C运算符

算数运算符(+ -* / % ++ --)
自加运算符号:++i 和 i++程序实现是不一样的,第一个是先将变量i+1再赋值,第二种是先将i赋值再进行+1操作。
关系运算符(> < == >= <= !=)
逻辑运算符 ( ! && || )
位运算符 (<< >> ~ | ^ &)
赋值运算符 ( = )
条件运算符 ( ?: )
逗号运算符 ( , )
指针运算符( * & )
求字节运算符( sizeof )
强制类型运算符( (类型) )
成员运算符(. — >)
下标运算符 ( [ ] )
其他

运算符的优先性

初等运算符 > 单目运算符 > 算术运算符 >(?) 关系运算符 > (?)逻辑运算符 > 条件运算符 > 赋值运算符 > 逗号运算符
运算符优先级具体说明:
非>算数运算符>关系运算符>与、或>赋值运算符

不同类型数据之间的混合运算
如果一个运算符两侧数据类不同,则先自动进行类型转换,使得二者具有同一种类型,然后再进行运算。
==强制类型转换运算符

关系运算符以及其优先次序:
高优先级:小于<、小于等于<=、大于>、大于等于>=
低优先级:等于==、不等于!=

关于逻辑运算符:与**&&和或||的优先级低于算数运算符,而非!**的优先级高于算数运算符。

算数表达式

符合C语法的句子称为C算数表达式。运算对象包括常量、变量、函数等
算数表达式和运算符的优先级和结合性

关系表达式

用关系运算符将两个数值或两个数值表达式连接起来的句子
关系表达式的值是一个逻辑值,真\假
关系运算符:大于小于等于之类

逻辑表达式

逻辑运算时,以数值1代表真,以数值0代表假

C语句

1:关于C语句:一个函数包含声明部分和执行部分、执行部分是由语句组成的
2:语句和声明的区别:语句经过编译后会产生指令,而声明只是对数据的定义,它不产生指令
3:语句的作用:向计算机系统发出操作指令,要求执行相应的操作。
一个C语句经过编译后产生若干条机器指令,声明部分不是语句,它不产生指令,只是对有关数据的声明。

C语句分为5类

——控制、函数调用、表达式、空语句、复合语句

1:控制语句(用来完成一定的控制功能) :
if( )…else…(条件语句)
for( )… (循环语句)
while( )… (循环语句)
do…while…(循环语句)
continue (结束本次循环语句)
break (终止switch 或循环语句)
switch (多路分支选择语句)
return(从函数返回语句)
goto (转向语句,在结构化程序中基本不用)
2:函数调用语句
函数调用语句由一个函数调用加一个分号构成。
3:表达式语句
由一个表达式加一个分号构成
4:空语句
只有一个分号
5:复合语句
把一些语句和声明用{ }括起来成为复合语句(又称为语句块)

赋值语句也是一种表达式语句,是最基本的语句

赋值表达式:变量、赋值运算符、表达式

赋值过程中的类型转换:
数据等输入输出:
C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的。
C语言函数库中有一批“标准输入输出函数”它是以标准的输入输出设备(一般为中端设备)为输入输出对象的。有putchar(输出字符)、getchar(输入字符)、printf(格式输出)、scanf(格式输入)、puts(输入字符串)、gets(输入字符串)。在使用系统库函数时,要在程序文件的开头用预处理指令#include把有关头文件放在程序中。
printf函数的一般格式:printf(格式控制,输出表列)
格式控制:用双撇号括起来的一个字符串,称为转换控制字符串,简称格式字符串,它包括两个信息:1格式声明 2普通字符
输出表列:是程序需要输出的一些数据,可以是常量、变量或者表达式。
格式字符:
1:d格式字符:用来输出一个有符号的十进制整数。
可以指定数据的域宽(所占的列数)
2:c格式字符:用来输出一个字符
如“%5d指定输出数据占5列,输出的数据显示在此5列的右侧
同理,也可以指定输出字符的域宽
在0-127间的数值可以用字符来表示
3:s格式字符用来输出一个字符串
4:f格式字符用来输出实数(包括单、双精度、长双精度),以小数形式输出,有几种用法 1:基本型:用%f——不指定输出的实数,由系统根据数据的实际情况决定数据所占的列数,一般处理方法为:实数中的整数部分全部输出,小数部分输出6位。2:指定数据宽度和小数位数,用%m.nf——例%7.2表示输出的数据占7列,其中包括2位小数,(实数部分占4位)最后一位小数采用4舍5入法处理。
5:e格式字符:用格式声明指定以指数形式输出实数。如果不指定输出数据所占的宽度和数字部分的小数位数,许多C编辑系统会给数字部分的小数6列宽度,指数部分占用5列。

c语言还提供有:
i格式字符:作用与%d格式符号相同
o格式字符:以8进制整数形式输出
x格式字符:以16进制数形式输出整数
u格式字符:用来输出无符号形式数据,以十进制整数形式输出
g格式字符:用来输出浮点数,系统自动选 f 或 e 的格式输出,选取其中长度较短的格式,不输出无意义的0

scanf函数输入数据:
scanf函数的一般形式:scanf(格式控制,地址表列)
格式控制的含义同printf函数,地址表列是由若干个地址组成的表列,可以是变量的地址,也可以是字符串的地址。
举例:scanf(“a=%f,b=%f”,&a,&b);

字符数据的输入输出
putchar函数输出一个字符
getchar函数输入一个字符

C程序选择结构设计

C语言有两种选择语句:if 语句; switch语句(其实属于控制语句)

1:if语句(用来实现两个分支的选择结构)

3种if语句的一般形式:

1:if(表达式)
语句1
else
语句2
2: if(表达式)语句1. (不执行else“否则”语句)
3: if(表达式1) 语句1
else if(表达式2)语句2
else if(表达式3)语句3
.
.
.
else if(表达式m)语句m
else 语句m+1

2:switch语句(用来实现多个分支的选择结构)

Switch(表达式)
{
case常量1:语句1
case常量2:语句2
.
.
.
case常量n:语句n
default:语句n+1
}

有一种if语句可以用条件运算符及表达式来代替
如:
if(a>b)
max=a;
else
max=b;
这个程序也可以表示成为:
max=(a>b)?a:b;
条件表达式的一般形为:表达式1?表达式2:表达式3
条件运算符号的优先级比算数运算符和赋值运算符都低

选择结构的嵌套

在if语句中又包含一个或多个if语句成为if语句的嵌套。
具体说明:在if后面的if条件句中该条件满足上一个if给限制的框架条件。

选择结构程序综合举例

闰年的计算:

C程序循环结构设计

为什么需要循环结构?
顺序和选择结构往往不足以处理日常生活中的一些实际问题,往往会遇到一些需要重复计算的实际问题。

用while实现循环

while语句的一般形式:
while(表达式)
语句
用do while语句实现循环
除了while语句以外,C还提供了do while 来实现循环结构。
do…while语句的一般形式为
do
语句
while(表达式);
说明:第一种是先进行判断再进行循环,第二种是先进行循环再进行判断。

用for语句实现循环

for语句的一般形式为:
for(表达式1;表达式2;表达式3)
语句
可以理解为
for(循环变量赋初值;循环条件;循环变量增值)
语句

循环的嵌套

三种循环可以相互嵌套。

几种循环的比较

使用while和do while 时候,循环变量的初始化操作应该在while和do while 语句之前
而使用for循环时循环变量的初始化操作可以在表达式1中实现。

改变循环执行状态
有时出现提结束循环操作的情况,则可以使用break语句和continue语句来实现提早结束循环
if(表达式)break;
用break是结束整个循环,而使用continue是结束本次循环

在C程序中利用数组批量处理数据

将一批具有同名的同属性的数据就可以组成一个数组(array)
数组是一组有序数据的集合。
用一个数组名和一个下标来唯一确定数组中的元素。
数组中的每一个元素都属于同一个类型。

怎样定义与引用一维数组
一维数组的一般形式为:类型符 数组名 [常量表达式];
数组中的下标是从0开始的

数组的赋初值[]=(……)
对于一些数组来说,为了使得程序简洁,常常需要对数组赋初值。

怎样定义与引用二维数组
有时候一些实际问题中数据需要两层抽象(像是不同年级中含有不同班级)
二维数组通常称为矩阵(可以理解为行列式的形式)
二维数组定义的一般形式为:
类型说明符 数组名[常量表达式][常量表达式]

字符数组
在C语言中是将字符串作为字符数组来处理的,而用’\0’来表示字符串的结束,系统存储字符串时候,会在字符结束时自动加上\0。
字符数组的输入输出
字符数组的输入输出可以有两种方法
1:逐个字符输入输出用“%c” 2:将整个字符串一次性输出用“%s”
使用字符串处理函数
puts(输出字符串的函数)——puts(字符数组)
gets(输入字符串的函数)——gets(字符数组)
strlen(测字符串长度的函数)——。。
strlwr(转换为小写的函数)
strupr(转换为大写的函数)

在C程序中用函数实现模块化程序设计

为什么需要用到函数
怎样定义函数
C语言要求在程序中所用到的所有函数,必须先定义后使用
定义函数应该包括以下几个方面:
制定函数的名字,以便以后按名称调用
指定函数类型,即函数返回值的类型
制定函数的参数的名字和类型,
指定函数应当完成什么操作,也就是函数是做什么的,即函数的功能
有一种函数是C编译系统提供的函数,库函数只是提供了最基本最通用的函数

函数分为无参数函数和有参数函数
在调用有参函数时,主调函数与被调函数之间有数据传输关系。在主调函数中,函数名后面括号中的参数称为“实际参数”,而定义函数时函数名后面括号中的变量名称称为形式参数。实际参数可以是常量、变量和表达式。
形参和实参间的数据传递:在调用函数的过程中,系统会把实参的值传递给被调用的形参。

调用函数
函数调用的一般形式为:
函数名(实参表列)

函数调用的过程:
step1:在定义函数时指定形参,在未出现函数调用时候,它们并不占用内存中的存储单元,在发生函数调用的时候,函数。。才被临时分配存储单元
Step2:将实参的对应的值传递给形参
Step3:执行函数时用已经被传值的形参进行有关的运算
通过return语句将函数值带回到主调函数
调用结束,形参被释放

对被调用函数的声明和函数原型
如果已经在文件的开头对本文件中所调用的函数进行了声明,则在各个函数中不必再进行声明。
函数的嵌套调用
函数可以进行嵌套调用

函数的递归调用
在调用一个函数时又出现直接或间接地调用函数本身称为函数的递归调用

数组作为函数的参数
数组元素可以做为函数的实参,不能作为函数的形参

局部变量和全局变量
局部变量(在一个函数内部定义的变量只在本函数内部范围有效,即只有在函数内部才难引用它们,在此函数以外是不可以引用的,以上这些变量称为局部变量。
全局变量:在函数之外定义的变量称为全局变量,全局变量使用范围是从定义变量的位置开始到本源文件的结束。
在一个函数中如果有局部变量和函数之前的全局变量重复,则该函数内部的局部变量会将全局变量给屏蔽,此时只有内部局部变量起作用。

关于变量的声明与定义
理解:定义一个函数时,变量只是一个符号,它并不会限制之后的数据符号输入。
内部函数与外部函数

变量的存储方式与生存期
动态存储方式与静态存储方式
静态存储方式是指在程序运行期间有系统分配固定空间的存储方式,而动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。
内存中供用户使用的空间:程序区、静态存储区、动态存储区。
在动态存储区存放以下参数:
函数形式参数,在调用函数时候给形参分配存储空间
函数调用时没有用关键字,static声明的变量,即自动变量
函数调用时现场保护和返回地址等等
在C语言中,每个变量都有两个属性,数据类型和数据的存储类别。
C的存储类别包括:自动的、静态的、寄存器的、外部的。。。

学会善于在C程序中利用指针

指针的定义
一个指向变量单元地址的数据(该数据就是该变量单元地址)

指针变量
一个变量的地址既是这个变量的指针,如果有一个变量专门存放另一个变量的地址,则这个变量称为指针变量。

说明:指针变量是代表的变量的值,前面有号,而指针是指的地址前面没有号,一个变量的地址也就可以称做这个变量的指针。
怎样定义指针变量: 类型名 *指针变量名;

一个指针变量包括两方面:1是以存储单元编号的表示的地址,一是它指向的存储单元的数据类型。例如,指向整形数据的指针类型表示为*int,读作指向int的指针或者是简称int指针。

双重指针的概念:*p1=&a——p1=&&a
变量之间的数值互换也可以通过该变量的地址来进行。

通过指针引用数组通过指针引用字符串
在C语言中,数组名代表数组中首个元素的地址(理解:数组名表示的是首地址,将程序引导至数组中)

引用数组愿随可以用下标法,也可以用指针法,即通过数组元素的指针叨叨所需要的元素。使用指针可以使得目标程序质量高,占用内存小,运行速度快。

在定义指针变量时可以对它进行初始化
例如.
intp=&a[0]
它等效于;
int
p;
p=&a[0];
不应当写成
*p=&a[0]

有关数组中的自加问题
在指针指向数组元素中时,可以对指针进行运算如:p+1(可以用+=;p+1指向同一数组中的下一个元素)注意这里的+1并不代表简单的加1,而是根据实际定义的数组的基类型的占用字节数系统自动加上。,例如数组元素时float型,+1就是代表加上4个字节,以使它指向下一个元素。

指向函数的指针
什么是指向函数的指针?
定义:在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址就称为这个函数的指针。(起始地址又称为函数的入口地址)
可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。
思考:函数名就是该函数的入口地址。例如:p=max其实不是将max函数的值赋给p,而是将max函数的地址赋给了p,故后面要用指针来调用函数max的话,还是应当使用?=*p来进行调用。

指向函数指针的变量:(使用指针来引用函数)
形式为:类型名(*指针变量名)(函数参数表列)

返回指针的函数
形式为:类型名* 函数名(参数表列)——例如:“int *a(int x, inty);”函数可以返回一个整型值、字符值、实形值,函数也可以返回一个指针类型值,其本质并没有变,只不过返回的变量用指针代替了而已

指针数组和多重指针:一个数组,其、若其元素均为指针类型的数据,称为指针数组。
一般形式:类型名*数组名[数组长度]

动态内存分配与指向它的指针变量
全局变量是分配在内存中的静态存储区的,非静态的局部变量是存储在内存中的动态存储区的,这个存储区是一个称为“栈”的区域,此外,C还允许建立内存动态分配区域,以存放一些临时使用的数据,这些数据不需要在程序的声明部分定义,也不必等到函数结束时候才释放,而是需要随时开辟,不需要时随时释放,这个区域称为“堆”,堆在底下向上生长,栈在上面动态分配

链表
什么是链表:一种常见的重要数据结构,可以进行动态的内存分配。链表根据需要开辟内存单元,链表有一个头指针变量,,它存放一个地址,该地址指向一个元素,链表中的每一个元素称为一个“结点”,每一个结点都应当包括两部分,1:用户需要的数据 2:下一个结点的地址;故链表中的各个元素在内存中的地址可以是不连续的。-显然,链表这种结构必须使用指针变量才能实现,即一个结点中应当包含一个指针变量,用它来存放下一个结点的地址。

对文件的输入输出:
文件相关:
C文件有关的基本知识:
什么是文件?
文件有不同的类型,在程序设计中,主要用到两种文件
1:程序文件包括源程序文件(后缀为.c)、目标文件、可执行文件(后缀为.exe)等
2:数据文件 文件的内容不是程序,而是提供程序运行时读写的数据,在程序的运行过程中输出到磁盘(或其它的外部设备中)中的数据,或在程序运行过程中供读入的数据,为了简化用户对输入输出设备的操作,操作系统将各个输入输出设备统一成文件来进行处理,从操作系统的角度来看,每一个输入输出设备都作为一个文件来处理。
输入输出是数据传输的过程,数据如同流水一样从一处流向另一处,因此经常将输入输出形象地称为流(数据流),流表示流数据从源端到目的端端流动。

文件的分类:二进制文件、ASCLL文件,二进制文件指的是不加转换地输出到外存的数据文件,也称为映像文件(像黑白像素显示这样的数据就不需要经过转换,直接可以用二值化表示);而ASCLL文件是必须经过转换输出的数据文件,像字符输出等。
ANSIC标准使用了文件缓冲区,文件无论是输入还是输出都经过缓冲区。

补充:
右结合性:表达式中最右边的操作最先执行,然后从右到左依次执行。
左结合性:同理右结合性质。

关于局部变量:
普通局部变量:任何一个在函数内部定义的变量都属于普通局部变量
静态局部变量:用static修饰,即使一开始不对它进行赋值,它也会被编译器初始化为0

使用C语言的7个步骤
1:定义程序的目标
2:设计程序
3:编写代码
4:编译
5:运行程序
6:测试和调试程序
7:维护和修改程序

目标文件、可执行文件和库
典型的C通过编译和链接两个步骤来完成将源代码文件转换为目标代码文件以及将目标代码文件和库代码、启动代码合并成可执行文件的操作。

提高程序可读性的技巧:
选择有意义的函数名
写注释
在函数中用空行分隔概念上的多个部分
每条语句各占一行

C程序习惯将main函数放在开头,因为它提供了最基本的框架。

调试器:通过逐步跟踪程序的步骤,并且记录每个变量,便可以监视程序的状态。

程序状态;是指在程序执行过程中,某给定点上所有变量值的集合。

简单的函数由函数头和后面的一对花括号组成,花括号中是由声明、语句组成的函数体。

显示8进制和16进制:%0%x.

进制是有前缀的:8进制前缀是0;16进制前缀是0x 。

C语言有多种printf()格式,:short类型:h前缀。 long类型:l前缀。

你可能感兴趣的:(c语言)