c语言,空指针,野指针,通用指针

本来只是不明白空指针是什么,后来百度,发现还有通用指针这么一说野指针是没有初始化的指针,想指哪里指哪里,空指针是指向0的指针,对吧?指针怎么可以指向一个常数0呢,指针应该... 本来只是不明白空指针是什么,后来百度,发现还有通用指针这么一说
野指针是没有初始化的指针,想指哪里指哪里,空指针是指向0的指针,对吧?
指针怎么可以指向一个常数0呢,指针应该指向一个储存空间啊?why?
还有空指针有啥用?
还有通用指针是什么?void *定义的么,
指针是定义好类型之后,才知道取所指向地址内容的时候 应该 取 多大一段字节的,
通用指针有啥用?
还有啊,网上搜到的那些我没看懂,求不复制粘贴
展开
 我来答
瘦死的小骆驼NO
推荐于2018-03-07 · TA获得超过4036个赞
知道小有建树答主
回答量:397
采纳率:100%
帮助的人:82.1万
展开全部
  • 空指针:空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。

  • 通用指针:通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。

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

  空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。空指针用0表示,C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL.    程序里可以写 p = 0;     或者 p = NULL; 两种写法都把p置为空指针值。相对而言,前一种写法更容易使读程序的人意识到这里是一个指针赋值。我们印象中C语言的指针都有类型,实际上也存在一种例外。

        这里涉及到通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。

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

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

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

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

englishisxu
2014-08-22 · 超过23用户采纳过TA的回答
知道答主
回答量:110
采纳率:0%
帮助的人:49.3万
展开全部
首先空指针并不是指向0的指针,空指针是什么,就是一个被赋值为0的指针,在没有被具体初始化之前,其值为0.
所以指针没有指向常数0,它指向的存储空间是NULL,暂时为0.
更多追问追答
追问
指向的那个储存空间是NULL,NULL 是内存中的一个特定的位置么?
正常的指针本身所占的内存中都存放一个地址,空指针存放0,是这个意思么
追答
正常的指针是指向内存的一片区域,指针的值就是这片内存的地址,而指针所指向的值是这片内存存放的实际内容;
空指针,就是不指向内存任何区域,所以就是用NULL来代替
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
郭某人来此
2015-10-03 · TA获得超过1646个赞
知道答主
回答量:952
采纳率:100%
帮助的人:90.1万
展开全部
野指针就是不知道指向哪里,或者说不知道指向的内存是否可以使用,一般都是刚刚声明但没有初始化的指针。

空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0

空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针,这样很危险,但如果养成将指针初始化为空指针的习惯,我们就能判断出这个指针是不是有效的(判断是不是NULL就可以了)

通用指针一般都用在函数传参,实现所谓的“多态”,但到函数里面使用时,一般还是被转换成具体类型的指针。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
XoriieInpottn
推荐于2017-11-26 · TA获得超过494个赞
知道小有建树答主
回答量:153
采纳率:100%
帮助的人:154万
展开全部
野指针就是不知道指向哪里,或者说不知道指向的内存是否可以使用,一般都是刚刚声明但没有初始化的指针。

空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0

空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针,这样很危险,但如果养成将指针初始化为空指针的习惯,我们就能判断出这个指针是不是有效的(判断是不是NULL就可以了)

通用指针一般都用在函数传参,实现所谓的“多态”,但到函数里面使用时,一般还是被转换成具体类型的指针。
更多追问追答
追问
但如果养成将指针初始化为空指针的习惯,我们就能判断出这个指针是不是有效的(判断是不是NULL就可以了)

这句话不懂哎,为何要养成将指针初始化为空指针的习惯,直接初始化成想要的不就行了么,干嘛要初始化成空的,防止野指针出现么?小心一点不就好了么,要是每个指针都要先初始化成空指针,然后在赋值,岂不是太麻烦,而且好降低程序效率?

判断这个指针是不是有效的,为啥要判断一个指针是不是有效的?有啥用?
追答

这种例子有很多,比如:

void *pA = NULL;

/**
 * 中间有一些程序,可能给pA分配内存,也可能不分配
 * 可能是对pA的一些复杂操作
 **/

if (pA != NULL) {
    free(pA);
}

其实说实话,每个人写程序的风格不同,并且C语言如此灵活,绝对没有固定的写法或套路,只是有时候某种习惯能避免我们出错,不要说只要够细心调试就可以不出错,这么说的一定都没写过10W行以上的大型应用。


再说效率,如果说一个好的习惯可以极大的提高可读性,降低出错的概率,那么即使有一些效率上的损失,也可以接受,况且,指针的这些习惯对效率的降低微乎其微。

我刚学C语言时也觉得太麻烦,会降低效率,记得后来经过试验,发现是否赋初始值等等操作带来的效率差别,只能在CPU的时钟周期数上察觉出来,人很难感觉到。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式