(1)编程语言分2种:强类型语言和弱类型语言。强类型语言中所有的变量都有自己固定的类型,这个类型有固定的内存占用,有固定的解析方法;弱类型语言中没有类型的概念,所有变量全都是一个类型(一般都是字符串的),程序在用的时候再根据需要来处理变量。就如:makefile、html语言。
(2)C语言就是典型的强类型语言,C语言中所有的变量都有明确的类型。因为C语言中的一个变量都要对应内存中的一段内存,编译器需要这个变量的类型来确定这个变量占用内存的字节数和这一段内存的解析方法。
(3)void类型的正确的含义是:不知道类型,不确定类型,还没确定类型、未知类型,但是将来一定有类型。
(4)void *a;(编译器可以通过)定义了一个void类型的变量,含义就是说a是一个指针,而且a肯定有确定的类型,只是目前我还不知道a的类型,还不确定,所以标记为void。
void “修饰”的是指针,因为指针就是内存地址,它不知道指向的另一个变量是哪一种类型,而变量一定是确定的,void a;就是错误的。
8.9、C语言中的NULL
NULL在C/C++中的标准定义
(1)NULL不是C语言关键字,本质上是一个宏定义,其保护指针的作用,不要让他乱开。
(2)NULL的标准定义:
#ifdef _cplusplus // 条件编译c++环境
#define NULL 0
#else
#define NULL (void *)0 // 这里对应C语言的情况
#endif
解释:C++的编译环境中,编译器预先定义了一个宏_cplusplus,程序中可以用条件编译来判断当前的编译环境是C++的还是C的。
NULL的本质解析:NULL的本质是0,但是这个0不是当一个数字解析,而是当一个内存地址来解析的,这个0其实是0x00000000,代表内存的0地址。(void *)0这个整体表达式表示一个指针,这个指针变量本身占4字节,地址在哪里取决于指针变量本身,但是这个指针变量的值是0,
也就是说这个指针变量指向0地址(实际是0地址开始的一段内存)。如 char *p=NULL; 因为0地址本身就不是我们来访问的,所以 *p时是不可访问的。在程序运行的逻辑上就不会出错。
正规写: int *p = NULL;// 定义p时立即初始化为NULL
p = xx;
if (NULL != p)
{
*p // 在确认p不等于NULL的情况下才去解引用p
}
(1)'\0'是一个转义字符,他对应的ASCII编码值是0,内存值是0,一个char空间。
(2)'0'是一个字符,他对应的ASCII编码值是48,内存值是int型48,一个char空间。
(3)0是一个数字,没有ASCll编码, 内存值是int型0,一个int空间。
(4)NULL是一个表达式,是强制类型转换为void *类型的0,内存值是0(内存地址),一个int空间。
8.9.1、运算中的临时匿名变量
<1>“小动作”:高级语言在运算中允许我们大跨度的运算。意思就是低级语言中需要好几步才能完成的一个运算,在高级语言中只要一步即可完成。譬如C语言中一个变量i要加1,在C中只需要i++即可,看起来只有一句代码。但实际上翻译到汇编阶段需要3步才能完成:第1步从内存中读取i到寄存器,
第2步对寄存器中的i进行加1,第3步将加1后的i写回内存中的i。
<2> float a=12.3; int b=(int)a; (int )a 就是匿名变量;先找一个内存空间,里面存(int)a; 然后把这个值赋值给b;最后匿名值销毁。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33816-16.html
死亡和无政府主义