1.
void* 这不叫空指针,这叫无确切类型指针.这个指针指向一块内存,却没有告诉程序该用何种方式来解释这片内存.所以这种类型的指针不能直接进行取内容的操作.必须先转成 别的类型的指针才可以把内容解释出来. 还有'\0',这也不是空指针所指的内容. '\0'是表示一个字符串的结尾而已,并不是NULL的意思. 真正的空指针是说,这个指针没有指向一块有意义的内存,比如说: char* k; 这里这个k就叫空指针.我们并未让它指向任意地点. 又或者 char* k = NULL; 这里这个k也叫空指针,因为它指向NULL 也就是0,注意是整数0,不是'\0' 一个空指针我们也无法对它进行取内容操作. 空指针只有在真正指向了一块有意义的内存后,我们才能对它取内容.也就是说要这样 k = "hello world!"; 这时k就不是空指针了. 2.如果函数的参数可以是任意类型指针,那么应声明其参数为void * 典型的如内存操作函数memcpy和memset的函数原型分别为: void * memcpy(void *dest, const void *src, size_t len); void * memset ( void * buffer, int c, size_t num ); 这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。空指针仅仅是申明了一个变量名,告诉编译器有个变量存在,当然你后面肯定会用到它(事实上你不用也没人怪你)。 注意C++中语法要求更严格,不允许直接对空指针赋值,而必须先进行类型转换。 3.指针指向的是地址,地址指向的是内容:我们需要一个变量,来存储地址,这个变量的值是地址,但是我们可以通过修改变量的值,来不断的改变地址,但是,我们如果需要改变该个地址的值的话,就需要,
对地址的值进行修改,而不改变地址。
4.
空指针定义: #ifdef NULL #undef NULL #ifdef _cplusplus #define NULL 0 /* 空指针值 */ #else #define NULL ((void*)0) /* 空指针常量 */ 5.常量指针和指针常量有什么区别
int a; int * const p = &a //指针常量,*p可以修改*p = 8;(OK) p不可以修改 p++(ERROR) int a,b; const int *p = &a;//常量指针 *p不可修改 *p = 8;(ERROR) p 可以修改 p = &b (OK) 还有一种 const int * const p = &a; // *p 和 p均不可改变了
关键要看const修饰的是谁 int const const int的写法是一样的 指针的话看const离谁( 是‘*’ 还是‘指针变量名’)比较近就是修饰谁的,比如 const * 表示带*运算对象的是常量,也就是*p 不可变 (暗示p可变,p不带‘*’ 嘛) * const 变量名 表示变量名是常量 也就是p不可变 (暗示*p可变,const没有修饰‘*“ 嘛)