c语言操作空指针风险,c语言学习--空指针

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没有修饰‘*“ 嘛)

你可能感兴趣的:(c语言操作空指针风险)