空指针,野指针,通用指针

我来啦~~~好久没来,感觉自己很颓废,不知道自己在做什么,要做什么,时间就一点点浪费掉了。。。

人生中有很多无奈,纠结,迷茫,焦虑,徘徊,失望,挣扎,努力,得到和失去...我把我能想到的词都放这里了偷笑

谁说的人生其实就是一场修行,把很多事情看淡看轻。

我是个废话坛子,不浪费大家时间了,转入正题:


以下内容都是转的,但也要认真看呀,不懂的看懂,懂的就当巩固。

Q1:指针使用之前一定要赋值吗?

是的。

指针使用之前一定要有两个步骤:

1.定义;

2.赋值指向,即将某个变量的地址存放到指针变量中。因为指针变量中原始存放的可能是系统一些重要数据区的地址,所以,如果不赋值指向的话,对指针进行操作可能会改变某些重要数据,引起严重后果。

一句话,使用指针时一定要明确指针当前指向的是哪个变量,也就是明白自己操作的对象具体是哪个。

参考:http://see.xidian.edu.cn/cpp/html/690.html


Q2:空指针,野指针,通用指针辨析

先复习一下“指针”:

假设 有语句 int a=10;

那么编译器就在内存中开辟1个整型单元存放变量a,我们假设这个整型单元在内存中的地址是 0x1000;那么内存0x1000单元中存放了数据10,每次我们访问a的时候,实际上都是访问的0x1000单元中的10.

现在定义:int *p;

                    p=&a;

当编译器遇到语句int *p时,它也会在内存中给指针变量p分配一个内存单元,假设这个单元在内存的编址为0x1003;此时,0x1003中的值是不确定的,(因为我们没有给指针赋值),当编译器遇到了p=&a时,就会在0x1003单元中保存0x1000,请看,这就是说:(指针变量p代表的)内存单元0x1003存放了变量a的内存地址!用通俗的话说就是p指向了变量a。


一、空指针

p=NULL,就是说:内存单元0x1003不存放任何变量的内存地址。

空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。

指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。

空指针用0表示,C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL.    程序里可以写 p = 0;     或者 p = NULL; 两种写法都把p置为空指针值。


二、野指针

野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。 

“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。


野指针的成因主要有两种: 

一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 

二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),(free和delete)它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例: 

char *p = (char *) malloc(100); 

strcpy(p, “hello”); 

free(p); // p 所指的内存被释放,但是p所指的地址仍然不变 

if(p != NULL) // 没有起到防错作用 

strcpy(p, “world”); // 出错 

另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放


三、通用指针

我们印象中C语言的指针都有类型,实际上也存在一种例外。这里涉及到通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。

int n=3, *p;

void *gp;

gp = &n;

p=(int *)gp;

有收获吗?还是白白浪费时间了?


参考:http://wenku.baidu.com/view/56d925d95022aaea998f0f6b.html###

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值