从大一开始学过C语言,到现在已经四年半了。当然肯定是不同的时期做不同的事情有不同的理解。现在做一些基础知识的小结吧。
C程序由各种源文件,头文件,库函数组成;
源文件,函数库,头文件由函数和变量组成。
一:变量:
变量是需要数据类型来声明的。C语言有各种数据类型。简单分类一下。
1:整型浮点型
2:字符型
3:指针类型
4:数组类型
5:聚合类型(如结构体)
6:“字符串类型”。C语言中不存在字符串类型,但是可以理解为一种类型。通常以字符串常量或字符数组的形式出现。
当我们在用上面的数据类型来声明一个变量的时候,我们通常仔细考虑其作用域和存储类型,较大型程序还有考虑链接属性。对于这三点,当我们在使用变量的时候,通常需要有一个清晰的概念。
作用域:简单的说的话,全局变量和局部变量。
连接属性:external, internal, none
存储类型:静态内存存储区,运行时栈内存上,动态分配的堆内存上。
具体这三点就不分别说了。
变量用运算符和操作符来操作。比如+ , - , * , / , %, [ ] , &, ()等等;字符串“类型”,用特殊的字符串操作函数来操作。如strlen(); strcpy(); strcat(); strncpy()等等。由此,字符串类型倒是有点像一种抽象数据类型的感觉(当然实际不是)。
变量,我们从左值和右值方面来考虑一下。变量的左值是内存区域的名字,右值是内存区域的内容。我们知道,变量就是为了方便我们访问内存用的,使得我们可以用名字访问内存而不是地址去访问内存。
下面来简单说下几种数据类型。指针类型,数组类型,“字符串类型”,结构体类型。
指针:指针变量是一个变量,这个变量的值既为一个内存的地址。指针变量的值的那个内存地址的内容,既指针所指的内容。为什么说指针是C语言的核心概念之一,也是容易出错的难点之一。因为指针变量的值是内存地址。内存是我们程序运行的载体。我们对指针的操作,就是直接操作内存,不小心就很容易出现各种问题:如访问和修改不属于自己的内存;分配内存不释放造成内存耗尽等。而这些问题在编程时容易出现。如指针不初始化,使用没有分配内存的指针,数组下标越界,malloc之后忘记free等等
数组:数组名是一个指针常量。数组进行下标访问,实际上也是指针操作。但数组在声明的时候就分配了内存空间,而指针在声明的时候并不分配空间;数组名是指针常量,不可以修改。
“字符串类型”:字符串通常以字符串常量和字符数组的形式出现。字符串常量放在静态存储区。用一个指针指向之。字符数组的存放位置视情况而定。
结构体类型:利用结构体,可以根据实际问题构造出很多的数据类型。比如网络协议栈中,任何一个层的PDU,都可以利用结构体来构造。比如DLPDU;又如windows中消息结构体MSG; 窗口句柄HANDLE; 又比如数据结构中说的各种抽象数据类型,链表,队列,树,图,等等。程序中各种结构体随处可见。我们在语法上可以把他理解为各种特殊的数据类型。
小结:
变量是需要数据类型来声明的;理解数据类型。
变量具有作用域,存储类型,链接属性;变量有运算符,操作符或操作函数;
变量具有左值和右值。变量是给一块内存区取了一个名字,根据声明变量时的数据类型给那块内存区赋予了逻辑上编译器能够理解的一种结构。
二:函数
函数是C语言模块分解的最细小的单位。
函数完成某种功能。
函数内部有变量和语句。
函数的代码存储在代码段。函数名也是一个指针,换句话说,是一块内存地址的标志。
从函数指针的角度,从某种意义上说,我们个人可以当一个函数为一种特殊的数据类型。
各种开发平台(操作系统)给我们提供了不同的函数库。
以上是一点C语言基本内容。
当然实际应用中,可能用于不同平台的不同应用的开发,那涉及到的内容就更加多了。比如用于各种操作系统的内核开发;用于windows平台上的win32 SDK的开发;用于linux嵌入式开发;用于传感器tinyos系统上的一些协议栈的开发(nesc);用于unix上的网络应用程序开发。还有各种各方面的内容。多线程编程等等