C和指针笔记---数据(1)

来源:互联网 发布:域名信息查询 编辑:程序博客网 时间:2024/05/16 15:47


本笔记对相关模糊问题的分析主要集中于K&R C和ANSI C两种标准之间。

(一)基本数据类型

变量三个属性:作用域,连接属性和存储类型。

C语言中只有四种基本类型:整型,浮点型,指针和聚合类型(数组和结构等)


整型家族

长整型至少应该和整型一样长,整型至少应该和短整型一样长。

程序的可移植性与数据有无符号

缺省的char类型是否有符号取决于编译器,这意味着不同机器上的char可能拥有不同范围的值,因此,只有当程序所使用的char型变量的值位于signed和unsigned值的交集中时,这个程序才是可移植的。如ANSI中的字符均位于这个范围之内。


 整型字面值

字面值指的是字面值常量,并且不允许改变。如const常量,它类似于普通变量,区别在于它不能改变,但它不同于define宏。

整型字面值类型取决于它是怎么定义的。在缺省情况下,数字字面值的类型就是整型的9种类型中最短但足以容纳整个值的类型。

字符常量的类型总是int,你不能在后面添加unsigned或long后缀。字符常量是指单引号包围的单个字符或者字符转义序列或三字母词,如‘M’、’\n‘、’??(‘、’\377‘

\ddd   1~3位八进制数所代表的字符;\xhh   1~2位十六进制数所代表的字符

    

浮点类型

浮点数家族包括float、double和long double三类,没有long float这种类型

ANSI仅规定:long double至少和double一样长,而double至少和float一样长。同时规定所有的浮点类型至少容纳从10-37至1037之间的任何值。


指针

这里先说下指针常量,以后关于指针的话题会更多。

指针常量和非指针常量本质上就是不同的,这是因为指针常量的值是编译器决定的,每次运行程序的时候都可能不同。

程序员事先可以确定知道某个特定变量的值,但是却无法确定其存放在内存中的位置。


字符串常量

C语没有提供类似 int 的字符串类型,但是提供了字符串常量。事实上,在C语言中,它是指一串以NUL字节(不是NULL)结尾的零个多个字符。字符串通常存储在字符数组中,这就是C没有字符串类型的原因。\

NUL字节不能存在字符数组内部。它是一个不可打印字符。

字符串是否能修改取决于编译器,可以通过设置编译选项自行选择是否可修改,但是在实践中这样做是很危险的,如果想修改字符串就存储在数组中,如下:

char str[] = "hello!";  

这条语句,该语句是按照数组的形式来一个个存放的,编译器将其解释为char   str[] = {'s','t','r','i','n','g','/0'}; 如果在函数内部出现的话,这几个字符将存放在堆栈中,所以不是字符串常量。

char *pstr = "hello!";

这条语句,该语句定义了一个指向"pstr"字符串的指针,并没有空间存放"pstr"字符串,显然把“pstr”当做字符串常量并存放在常量区是最合适的选择。并且语句 psz[4] = 'x'; 在编译时不会报错,执行时会产生异常,原因是“string”存放在只读存储区,不可以修改。

这和C++中 const char *psz = "string";一句是一样的,所以最好显示的加上const关键字从而让编译器检测出“修改常量“错误,这样就可以提前修改。

字符串常量出现在一个表达式中时,表达式所用的值其实是这些字符所存储的地址,而不是这些字符本身。因此可以把这个字符串常量赋值给另一个“指向字符的指针”,而不能赋值给一个数组,因为字符串常量的直接值是一个指针。

    

原创粉丝点击