1、C语言只有4种基本的数据类型——整型、浮点型、指针和聚合类型(数组和结构等),其他类型都是由这4种派生而来。对于整型值来说,长整型至少应该跟整型一样长,而整性至少应该跟短整型一样长。(ANSI C并没有规定长整型必须比短整型长,只是规定不能比它短)。所有的浮点类型至少能容纳从-10^37到10^37之间的任何值。
2、以下说明了各种整型变量的最小允许范围(考虑到各个环境中的可移植性问题):
类型 最小范围
char 0到127
signed char -127到127
unsigned char 0到255
short int -32767到32767
unsigned short int 0到65535
int -32767到32767
unsigned int 0到65535
long int -2147483647到2147483647
unsigned long int 0到4294967295
3、当可移植性问题比较重要时,字符是否为有符号数就会带来两难的境地.最佳的妥协方案就是把存储于char型变量的值限制在signed char和unsigned char的交集里,可以最大程度的获得可移植性同时不牺牲效率.而且只有当char型变量显式声明为signed或unsigned时,才能进行算术运算.
4、C语言如此流行的一个重要原因就是指针,其可以有效的实现高级结构,也由于C没有诸如不允许在指针上执行算术或比较操作,不允许以任何方式创建指向已经存在的数据对象的指针之类的限制,所以能用C写出更为紧凑和有效的程序。也正是因为对指针的使用不加限制,指针也成为了很多奇葩错误的根源。变量在计算机(内存)中占据特定位置,而每个位置由地址唯一确定并加以引用,指针其实是地址的另一个名字。而指针变量就是存储的内容为地址的变量。
5、指针常量与非指针常量(字面值)在本质上不同,因为我们无法在知道计算机在内部将分配哪段存储空间(地址)给变量,而且在被函数调用时,自动变量(局部变量)可能每次分配的内存位置也不相同,所以C语言内部出了NULL指针,没有特地定义这个概念。
6、对于指针的声明,其形式如下:
(类型)*(变量名);
int* a; int * a; int *a;
从理论上来说,这三种声明方式都是正确的,而且int* a看上去更加清楚,即a被声明为类型为int*的指针,但是并不推荐这样声明,看看下面的语句吧:
int* a, b, c;
是不是很自然的以为这条语句把所有的三个变量声明为指向整型的指针?但其实只是声明了一个变量指向整型,两个整型变量。而要声明三个指向整型的指针,正确的语句如下:
int *a, *b, *c;
但是这类的声明在初始化的时候有可能会产生误解,即把值赋给*a,而事实上是给a。
7、当常量涉及到指针变量时,会变得很有趣,因为指针变量以及它指向的实体,都有可能成为常量,有如下几种形式:
(一)指向常量的指针
int const *pi;
其表示声明了一个指向整型常量的指针,可以修改指针的值(其他变量的地址),但是不能修改它指向的值。
(二)指向变量的常量指针
int * const pi;
此时指针是常量,不能修改指针的值,但是可以修改其指向的整型变量的值。
(三)指向常量的常量指针
int const * const pi;
此时无论指针还是其指向的值都是常量,都不允许被修改。