参考博文
C语言再学习 – NUL和NULL的区别
对字符串常量 的理解
基本数据类型
4种基本数据类型——整型、浮点型、指针和聚合类型(如数组和结构)。
整型
整型一共有9种——char , signed char ,unsigned char ,short int ,unsigned short int ,int ,unsigned int , long int ,unsigned long int。
这9种类型在程序中的分配的内存大小是不确定的,不同的机器上可能是不同的,但ANSI标准里加入了一个规范,这个规范规定了各个整型最小的表示范围,这样就更利于程序的移植。在头文件limits.h中定义了诸如SCHAR_MIN SCHAR_MAX UCHAR_MAX的宏,这些宏描述了你机器上对这9种整型数据类型表示范围。我将它们打印了出来:
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("字符位数 %d\n",CHAR_BIT);
printf("字符型 SCHAR_MIN=%d SCHAR_MAX=%d UCHAR_MAX=%d\n",SCHAR_MIN,SCHAR_MAX,UCHAR_MAX);
printf("短整型 SHRT_MIN=%d SCHRT_MAX=%d USHRT_MAX=%d\n",SHRT_MIN,SHRT_MAX,USHRT_MAX);
printf("整型 INT_MIN=%d INT_MAX=%d INT_MAX=%u\n",INT_MIN,INT_MAX,UINT_MAX);
printf("长整型 LONG_MIN=%ld LONG_MAX=%ld LONG_MAX=%lu\n",LONG_MIN,LONG_MAX,ULONG_MAX);
//printf("%ld\n",NULL);
return 0;
}
字符位数CHAR_BIT是char 类型的位数。从最后两行可以看出,长整型并非一定比整型表示的范围更大,编译器只能保证长整型的范围不小于整型。
这里要提一下char这个类型,虽然单独设计一个char的目的是为了让它容纳字符型值,但字符在本质上是小整型值,缺省的char要么是signed char,要么是unsigned char,这取决于编译器。如果在A机器中字符变量char定义为signed char类型,但在B机器中char 被定义为unsigned char类型,那么就不能确保程序移植的正确性。因为如果A中使用-100到+100来表示字符,B中使用0到+200来表示字符,那么这两个不相交部分的字符就是不可移植的。因此为了确保移植的正确,要在signed char 和unsigned char范围的交集内——0到127 来定义字符,ASCII就是如此。
浮点型
浮点数包括float、double、long double,通常这些类型分别提供单精度、双精度。与整型类似,在float.h头文件里定义了FLT_MAX DBL_MIN 和LDBL_MAX,分别表示float double 和 long double能够存储的最小值。浮点数字在缺省的情况下都是double类型的,除非它的后面跟一个L或l表示它是一个long double 类型,或者跟个F或f表示它是一个float类型的值。
组成原理:
指针
指针是C语言的精髓所在,单从数据类型的角度来看指针的话,C语言允许在指针上执行算数或比较操作,也允许创建指向已经存在的数据对象的指针。
这里要特别提一下C语言中的“字符串常量”,因为一个字符串常量的直接值并不是具体的字符,而是一个指向字符的指针,因此你可以把一个字符串常量赋给一个字符指针变量,但不可以赋给一个字符数组,比如:
#include <stdio.h>
int main()
{
char a[10];
a="abc";
return 0;
}
这样写会出现错误:
#include <stdio.h>
int main()
{
char *a;
a=“abc”;
return 0;
}
这样写是正确的,而且相比于“char * a = "abc”,更能突出字符串常量“abc”的直接值是一个指针的事实。
如果对字符串常量还有疑惑,可以参考文章开头的文章链接,讲的很仔细。
聚合类型此处不展开,之后专题复习时在统一解析。
本篇博文主要参考了《c和指针》。