搞懂C语言各种指针、NULL指针、零指针、野指针、悬垂指针…

void* 类型指针:通用变体类型指针;可以不经转换,赋给其他指针,函数指针除外;malloc返回的就是void*类型。

NULL指针:是一个标准规定的宏定义;#define NULL ((void *) 0) 用来表示空指针常量;

零指针:指针值为0,零值指针,没有存储任何内存地址的指针;可以使任意一种指针类型,eg:void * ;int * ;double *;

空指针:指针赋值为0;0*7;3-3等之后,指针即变成空指针;即:空指针不指向任何实际的对象或者函数;NULL指针和零指针都是空指针。

野指针:指向垃圾内存的指针;(1)指针变量没有初始化(2)指针被delete或者free之后没有置为空(3)指针操作超越了变量的范围

悬垂指针:指向曾经存放对象的内存,但是该对象已经不存在了;delete操作完成后的指针就是悬垂指针,此时需要将指针置为0变为零值指针;

在vc的debug模式下,对于未初始化的栈内存全部填成0xcc,对应于MBCS编码中汉字字符串看就是烫烫烫烫;对于未初始化的队内存全部填成0xcd,对应于汉子字符串看就是屯屯屯屯;release模式下直接就是内存中随机的数据。

在查阅资料的时候,无意发现了这篇博客。发现写的很详细,适合学习。但是由于博客排版的问题,并不是很方便学习,所以,秉着学习的态度,将次博客转载到这里,方便大家共同学习进步。(在转载过程中,除了排版的修正外,适当的做了些修改,还望见谅。)

文章不错,不敢独享!

分享之后我还是要推荐下我自己的C语言/C++学习群:375063003 ,不管你是小白还是大牛,小编我都挺欢迎,不定期分享干货,包括我自己整理的一份2017最新的学习资料和零基础入门教程,送给大家,欢迎初学和进阶中的小伙伴。

第一章。指针的概念

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,即一个能够存放内存地址的变量。

程序中引入指针,并不是对指针地址做什么处理,而是要通过指针地址,来对这个地址空间内的数据进行处理,所以我们提到指针,必然会涉及到指针所指空间内的数据(如类型等)特性。

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。

让我们分别说明。

先声明几个指针放着做例子:

例一:

(1)int *ptr;

(2)char *ptr;

(3)int **ptr;

(4)int (*ptr)[3];

(5)int *(*ptr)[4];

1。 指针的类型。

从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:

(1)int *ptr; //指针的类型是int *

(2)char *ptr; //指针的类型是char *

(3)int **ptr; //指针的类型是 int **

(4)int (*ptr)[3]; //指针的类型是 int(*)[3]

(5)int *(*ptr)[4]; //指针的类型是 int *(*)[4]

我们可以这样理解,一个基本的数据类型(包括结构体等自定义类型)加上” * “号就构成了指针的类型。这个类型定义的变量大小是一定的,与” * “号前面的数据类型无关,” * “号前面的数据类型只是说明指针所指向的内容里存储数据的类型。

怎么样?找出指针的类型的方法是不是很简单?