C语言数据模型
计算输出所含字符数的C语言程序1
2
3
4
5
6
7
8
9#include<stdio.h>
int main()
{
int num;//声明变量的类型
num = 0;//初始化num为0
while (getchar() != EOF)//使用getchar一次读入一个输入字符
++num; /* add 1 to num *///在每次字符读入后递增num变量,知道没有输入字符可供读入为止。EOF会提示文件已达末尾。
printf(“%d\n”,num);//将num的值以十进制整数之后加上换行符的形式打印出来
}
C语言类型系统
静态部分
主要描述了数据可能拥有的值。
类型系统包含整数这样的基本类型以及一些类型构成规则,利用这些规则可以用一直的类型逐步构建更加复杂的类型。
- 字符(char, signed char, unsigned char)
- 整数(int, short int, long int, unsigned)
- 浮点数(float, double, long double)
- 枚举(enum)
其中整数和浮点数是算术类型。
可以使用基本类型或使用这些规则构建好的其他类型。
数组类型
数组可由字符,算术类型,指针,结构体,共用体或其他数组构成结构体类型
结构体是由称为成员或字段的变量构成的分组。在结构体中,不同的成员可以具有不同的类型,但是每个成员都必须具有某一个类型的元素。
T1…Tn是类型,M1…Mn是成员名称1
2
3
4
5
6
7struct S{
T1M1;
T2M2;
T3M3;
……
TnMn;
}共用体类型
共用体类型允许一个变量在程序执行的不同时期具有不同的类型。
声明:1
2
3
4
5
6
7union {
T1M1;
T2M2;
T3M3;
……
TnMn;
}x;
定义了变量x,可以存放类型为T1…Tn中任意一种的值,成员名称M1…Mn用来指示x的值现在应该是哪种类型。也就是说,x.Mi就表示x的值是类型Ti的值。
- 指针类型
指针类型的变量包含在某个存储区域的地址,可以通过指针间接的访问另外一个变量。声明T *p;
获取对象的地址用&p = &x
将x的地址赋值给p。就是让p指向x,用在p前面的*会获取p指向的框的值。
C语言的typedef结构可用来创建类型名称的同义字。
typedef <类型描述符> T
函数
如果函数没有返回值,那么该函数类型就是void类型的。一般情况下,可以应用类型构成规则任意地构建类型,不过也存在一些限制,比如,不能构建“函数数组”,不过构建由指向函数的指针构成的数组是可以的。
动态部分
对数据进行的操作
- 创建或销毁数据对象的操作
对于数据的创建,C语言提供了几种简陋的机制,在函数被调用时,会创建对应每个局部参数的框,这些框都用来存放参数的值。
另一种数据创建机制就是使用程序库例程malloc(n),该例程可以返回一个指针,指向n个未使用的连续字符位置,这些存储空间可以被malloc的调用者用来存储数据,餐后就可以在这一存储区域中创建数据对象。
C语言有着类似的方法来销毁数据对象,当函数返回时,该函数调用的局部参数将不服村组,例程free会释放malloc创建的存储空间,特别要说的是,使用free(p)的效果是释放p指向的存储区域,若使用free去销毁不是通过调用malloc创建的对象,会造成灾难性后果。
访问或修改数据对象某些部分的操作
C语言具有访问对象某些部分的机制,可以使用a[i]访问数组a的第i个元素,用x.m访问结构x的成员m,还可以用*p访问指针p指向的对象。
在C语言中,修改(或者说是写)值主要是赋值运算符完成的,这让我们可以改变对象的值。将若干数据对象的值组合起来,为某个数据对象生成新值的操作
1.算术运算符
2.逻辑运算符
3.比较运算符
4.位运算符
5.赋值运算符
6.强制转换运算符
解释C语言程序的标识符与名字(用于“框”或数据对象)之间的区别
标识符是在程序中自定义的一些符号和名称。比如NULL,EOF,TRUE,FALSE。
要跟关键字区分开来:关键字是C语言默认提供的符号,标识符是程序员自定义的。标识符有预定义标识符和已定义标识符。
名字是自己定义的,是C语言标识符的一种