《C语言深度剖析》学习笔记三
1.10.3,void指针
【规则 1-35】千万小心又小心使用void指针类型。
按照 ANSI(American National Standards Institute)标准,不能对 void指针进行算法操作,即下列操作都是不合法的:
void * pvoid;
pvoid++; //ANSI:错误
pvoid += 1; //ANSI:错误
ANSI 标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。也就是说必须知道内存目的地址的确切值。
例如:
int *pint;
pint++; //ANSI:正确
但是大名鼎鼎的 GNU(GNU's Not Unix的递归缩写)则不这么认定,它指定 void *的算法操作与 char *一致。因此下列语句在GNU编译器中皆正确:
pvoid++; //GNU:正确
pvoid += 1; //GNU:正确
在实际的程序设计中,为符合 ANSI标准,并提高程序的可移植性,我们可以这样编写
实现同样功能的代码:
void * pvoid;
(char *)pvoid++; //ANSI:正确;GNU:正确
(char *)pvoid += 1; //ANSI:错误;GNU:正确
GNU和 ANSI 还有一些区别,总体而言,GNU 较 ANSI 更“开放”,提供了对更多语法的支持。但是我们在真实设计时,还是应该尽可能地符合 ANSI 标准。
【规则 1-36】如果函数的参数可以是任意类型指针,那么应声明其参数为void *。
典型的如内存操作函数 memcpy 和 memset 的函数原型分别为:
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
这样,任何类型的指针都可以传入 memcpy和 memset 中,这也真实地体现了内存操作函数的意义, 因为它操作的对象仅仅是一片内存, 而不论这片内存是什么类型。 如果memcpy和memset的参数类型不是void *, 而是char *, 那才叫真的奇怪了! 这样的memcpy和memset明显不是一个“纯粹的,脱离低级趣味的”函数!
下面的代码执行正确:
例子:memset 接受任意类型指针
int IntArray_a[100];
memset (IntArray_a, 0, 100*sizeof(int) ); //将 IntArray_a清0
例子:memcpy 接受任意类型指针
int destIntArray_a[100], srcintarray_a[100];
//将 srcintarray_a拷贝给 destIntArray_a
memcpy (destIntArray_a, srcintarray_a, 100*sizeof(int) );
有趣的是,memcpy 和 memset函数返回的也是 void *类型,标准库函数的编写者都不是一般人。
1.10.4,void不能代表一个真实的变量
【规则 1-37】void不能代表一个真实的变量。
因为定义变量时必须分配内存空间,定义 vo
相关文档:
第一章 导言
1,定义(define)与声明(declaration)
定义表示创建变量或分配存储单元;而声明指的是说明变量的性质,但不分配存储单元。
第二章 类型、运算符和表达式
1,数据类型及长度
C中只有4种基本数据类型:char ,int ,float ......
上学期间基本上都在windows下编程,就是学了一点LINUX,也是一些基本操作,在LINUX下编程几乎没有过,上班后都是在UNIX下的开发,突然之间有点感觉自己无处下手,感觉不会了,组长让我编一个程序,我想了半天在网上查了半天,有点思路了,在编译时确实错误连连,感觉都很有压力,但我会慢慢习惯的,我相信自己。
问题:
1 ......
getchar函数是定义在 stdio.h 文件中的一个输入函数。它从标准输入设备(一般是键盘)中读取一个字符。
在实际工作中,它是这样完成的:
键盘输入到计算机中的字符并不是立刻送到内存中指定位置,而是会首先缓存到一个缓冲区中。这个是计算机为了弥补不同硬件之间速度差距,而惯用的伎俩。
当在程序中第一次调用 getchar ......
在这个例子里,回调函数比较两个值。查找函数向比较函数传递两个指向需要进行比较的值的指针,并检查比较函数的返回值。例如:零表示相等的值,现在查找函
数就与类型无关,因为它本身并不执行实际的比较。确实,调用者必须编写必需的比较函数,但这样做是很容易的,因为调用者知道链表中所包含的值的类型 ......
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。
举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,� ......