结构体、联合
结构体
结构体是一个或多个变量的集合,这些变量可能为不同的类型,为了方便处理而将这些变量组织在一个名字之下(某些语言称之为“记录”,比如Pascal语言)。
区分于数组,结构中变量类型可以不同,结构将一组复杂数据组织在同一连续(一般情况,但不保证)存储单元下,而不是视为独立个体,有助于分析处理复杂的数据,特别是在大型程序中,如:
工资记录就是用来描述结构的一个传统例子,每个雇员由一组属性描述,包括姓名、地址、社会保险号、工资等
其中某些属性也可以是结构,例如姓名可以分几部分,地址甚至公司也可能出现类似的情况
c中更典型的一个例子来自于图形领域:点由一对坐标定义,矩形由两个点定义等
struct point{int x,y;};struct rect{struct point pt2,pt2;};
ANSI标准在结构方面最主要的变化是定义了结构的赋值操作———结构可以拷贝、赋值、传递给函数,函数也可以返回结构类型的返回值。实际在ANSI标准多年以前这些操作就已经被大多数编译器所支持,但直到这一标准才对其属性进行了精确定义。ANSI标准中,自动(非外部的)结构和数组现在也可以通过 ...
数组
数组:一组具有相同数据类型变量的集合
数组名:表示这组数据的名字
索引:标识数组中数据的位置
数据元素:构成数组的每个数据项,数组名+索引 如:a[i]表示数组a的第i个元素
一维数组
定义一维数组格式:数据类型 数组名[正整数] 例:float score[10];
数组的初始化是在声明后面紧跟一个初始化表达式列表,列表用花括号括起来,各初始化表达式之间通过逗号分隔
如:int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
定义了一个由12个对象组成的集合,对象存储在相邻的内存区域中
定义数组时可对数组进行初始化,存在几种不同情况,例: 以按行存储为准
int a[5]={12,34,56,78,9}; 标准形式,全部初始化
int a[5]={0}; 初始化表达式的个数比数组元素数少,则没有初始化表达式的外部变量、静态变量和自动变量元素将被 ...
变量作用域、存储类型
c程序可以看作是一系列外部对象构成,这些外部对象可能是变量或函数
外部对象和内部对象
external和internal是相对应的,internal用于描述定义在函数内部的函数参数及变量,外部变量定义在函数之外,可以在许多函数中使用。默认情况下,外部变量与函数(默认是external)具有下列性质:
通过同一个名字引用的所有外部变量(即使这种引用来自单独编译的不同文件)实际上都是引用同一个对象(标准中将这一性质称为外部链接)
在这个意义上,外部变量类似于Fortran语言的COMMON块或Pascal语言中在最外层程序块中声明的变量
每个源文件中包含一个编译预处理命令和若干函数和变量定义,各个文件可以单独编译,并可以与库中已经编译过的函数一起加载。源文件里的内容一般都是相对独立的,在编译时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接就行了。在不同系统中,保存在多个源文件中的c程序的编译和加载工作是不同的,如在UNIX系统中可使用cc命令:
cc main.c geline.c strindex.c 编译文件后,将生成的目标代码分别放在文件main. ...
头文件、预处理器、宏
头文件
在考虑将一个程序分解为若干个源文件的情况下,一般主要考虑的是实际程序中分别来自于不同的单独编译的库,这种情况下,必须考虑定义和声明在这些文件中的共享问题。应尽可能将共享部分集中在一起,这样就只需要一个副本,维护程序时也可以提升可维护性。所谓的头文件,其实它的内容跟源文件中的内容是一样的,都是c的源代码,但头文件一般是不用来进行编译的,只是把把所有的函数声明全部放进一个头文件中,当某一个源文件需要它们时,就可以通过宏命令 “#include”包含进这个源文件中,从而把它们的内容合并到源文件中去,当包含该头文件的源文件被编译时,这些被包含进去的头文件的作用便发挥了。注意,头文件起到的是将程序的不同源文件声明串联起来的作用,与库文件完全不是一个概念(后者是已经编译过的可执行文件)。
实际应用中,通常一方面希望每个源文件只能访问完成任务所需的信息,另一方面维护过多的头文件较为困难。对于中等规模的程序,最好只用一个头文件存放程序中各部分的共享对象,较大程序可能需要使用更多的头文件,需要精心进行组织。
一般的c语言项目工程的头文件应该具有的内容:
宏定义(#define),包括带参和不 ...
c语言控制流
程序语言中的控制流语句用于控制各运算执行的次序
语句与程序块
表达式后加上一个';',就变成了一个语句,如:x=0;i++;printf("");
c中';'是语句结束符(简单语句),但Pascal等语言中将';'用作语句之间分隔符
空语句指什么都不执行,语句本身只有一个分号';'
当一个语句过长时,可以直接换行,并不会影响语句的编译,特殊情况下需要在待续的行末尾加上一个反斜杠'\'
复合语句(也叫程序块)是以花括号{}将说明和若干个有序的语句(一组声明和语句)组合在一起而构成的语句集合
复合语句在语法上等价于单条语句
{
内部数据说明
简单(复合)语句表
}
如:函数体中、if-else、while、for中花括号括起来的多条语句
右花括号用于结束程序块,其后不需要分号
程序块的基本结构有三种:顺序结构,分支结构,循环结构
选择语句
用于条件判定
if语句
功能为单选结构
语句既可以是简单语句也可以是复合语句(等价)
基本格式:if (表达式)
语句 ...
c语言知识点总结
词法规则
程序由存储在文件中的一个或多个翻译单元(translation unit)组成
程序的翻译分几个阶段完成,翻译的第一阶段完成低级的词法转换,执行以字符#开头的行中的指令,并进行宏定义和宏扩展
在预处理完成后,程序被归约为一个记号序列
<!-- more -->
记号
c中共有6类记号:标识符、关键字、常量、字符串字面值、运算符和其他分隔符
空格符、横向制表符、纵向制表符、换行符、换页符和注释(统称空白符)在程序中仅用来分隔记号,因此将被忽略
相邻标识符、关键字和常量之间需要用空白符来分隔(但标识符、常量、字符串字面值等和运算符直接相连是很常见的)
如果到某一字符为止的输入流被分隔成若干记号,那么下一个记号就是后续字符序列中可能构成记号的最长字符串
注释
‘/’+’’……’’+’/'表示c语言中的注释符号,可以多行,编译程序时完全忽略这部分内容
c99以上标准中的注释符号为单边的//,单行注释
注释出现的位置:文件头,函数,重点语句块前
注释不能够嵌套,也不能出现在字符串字面值、字符字面值中
如main,printf等统称为系统预定义标识符,用户自定义标识符包 ...
c语言标准
注:这本笔记c的内容主要参考的是K&R的TCPL第二版,因此实际是ANSI C的标准
关于C99出现的一些变化均集中整理到这部分来 (c11后面的变化暂时还没整理)
K&R C
1978年,丹尼斯·里奇(Dennis Ritchie)和Brian Kernighan合作出版了《C程序设计语言》的第一版
书中介绍的C语言标准也被C语言程序设计师称作“K&R C”,第二版的书中也包含了一些ANSI C的标准。
K&R C主要介绍了以下特色:
结构(struct)类型、长整数(long int)类型、无符号整数(unsigned int)类型、把运算符=+和=-改为+=和-=
因为=+和=-会使得编译器不知道用户要处理i=+10还是i=-10,使得处理上产生混淆。
即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最低标准要求,许多老旧的编译仍然运行K&R C的标准。
C89(ANSI C,C90,ISO C)
1989年,C语言被ANSI标准化(ANSI X3.159-1989),标准化的一个目的是扩 ...
第一篇博客,写给自己
这是我的第一篇博客,早就想用博客记录一些生活中的所学所想,但是一直碍于麻烦,所以一拖再拖,直到今天折腾了好久才把博客搭起来。
不出意外的话接下来一段时间每天都保持更新,博客的内容基本上是自己之前看视频和论坛整理下来的文本,基本都是非常小白的内容,另外还有一些看过文章的转载。
我不知道我会在这条道路上走多远多久,既然选择了这条路,那就踏踏实实走下去,最起码学会一点技能也是好的吧。
也许未来的路会很曲折,我对于开发的信心也不是很足,至少从现在来看,我学的非常浅显,算是最基础的东西。
我希望通过深入的学习,发掘最根本最精华的东西,然后去探寻我内心深处真正热爱的事业。
“合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下不积跬步,无以至千里;不积小流,无以成江海。“
任何事物的运动变化,总是先以微小的、不显著的变化开始,经过逐步积累而达到显著的、根本性质的变化。
慢慢积累,未来可期。