| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 736 人关注过本帖
标题:指针的初始化问题
只看楼主 加入收藏
kevin_c
Rank: 1
等 级:新手上路
帖 子:28
专家分:5
注 册:2015-10-15
结帖率:91.67%
收藏
已结贴  问题点数:10 回复次数:7 
指针的初始化问题
当想要将指针的指向空,那么有int *p = 0。
那如果我定义一个指向字符型变量的指针,想让这个指针指向空,是否有char *p = '\0'还是char *p = 0.
还有指向数组的变量的指针呢?
2015-10-28 09:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:4 
当想要将指针的指向空,那么有int *p = 0。
------ 在C中,唯一的标准做法是 int *p = NULL

是char *p = '\0'还是char *p = 0.
------ 依然还是 char *p = NULL

对于 char *p = xxx,你知道这句话是什么意思吗?
它的意思是 p 是一个 char* 类型的变量,并赋初值 xxx;
重要的事需要再强调一遍:是 p 赋初值为 xxx,不是 *p 赋初值为 xxx。
所以你拿一个int类型的'\0',赋初值给一个char*类型的p变量干什么?
2015-10-28 12:35
kevin_c
Rank: 1
等 级:新手上路
帖 子:28
专家分:5
注 册:2015-10-15
收藏
得分:0 
哦~原来如此,但我看到书上是这么写的。难道书写错了吗?
2015-10-28 16:54
kevin_c
Rank: 1
等 级:新手上路
帖 子:28
专家分:5
注 册:2015-10-15
收藏
得分:0 
回复 2楼 rjsp
哦,原来如此,但我看到书上是这么写的,难道书写错了吗?
2015-10-28 16:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
C語言中的空指針,用宏NULL表示,別理那宏是0還是什麽別的定義,NULL指針兼容數値0,故可以寫0,也可以寫NULL。事實上,很多C程序員是直接寫0的。到了C++,明確規定空指針是nullptr,那是一個語言内置的數據類型,不是C那樣的數値,不過,由於C++兼容C,代碼中對指針賦值0,也是允許通過的。C++89時已經有nullptr,很多C++編譯器都支持,但當時還不算是標準,到C++11標準,是明確建議使用nullptr取代NULL的。

授人以渔,不授人以鱼。
2015-10-28 17:07
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:4 
回复 5楼 TonyDeng
好像C语言一直是不允许NULL写0吧,反倒是早期的C++允许。C语言的NULL应该是((void*)0), C标准是 void* 转任意同类型指针或者任意指针转void*都是允许不用类型转换(const还是要加以限制),但是C++的类型检测比c要严格些,(void*)不用类型转换是不允许转成int*, 后来C++就直接用0来代替NULL,也就是所0不用类型转换直接可以隐性转任意指针。void*在C语言里面就是表示的是任意类型的指针。

[此贴子已经被作者于2015-10-28 17:47编辑过]

2015-10-28 17:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
6.11 为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地出现?

C 程序员传统上喜欢知道很多 (可能比他们需要知道的还要多) 关于机器实现的细节。 空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根据的猜测。 而预处理宏 (NULL) 的使用又似乎在暗示这个值可能在某个时刻或者在某种怪异的机 器上会改变。``if(p == 0)" 这种结构又很容易被误认为在比较之前把 p 转成了整 数类型, 而不是把 0 转成了指针类型。最后, 术语 ``空" 的几种用法 (如上文 问题 6.10 所列出的) 之间的区别又可能被忽视。

 冲出这些迷惘的一个好办法是想象 C 使用一个关键字 (或许象 Pascal 那样, 用  ``nil") 作为空指针常数。编译器要么在源代码没有歧义的时候把 ``nil" 转成适 当类型的空指针, 或者有歧义的时候发出提示。现在事实上, C 语言的空指针常 数关键字不是 ``nil" 而是 ``0", 这在多数情况下都能正常工作, 除了一个未加修饰 的 ``0" 用在非指针上下文的时候, 编译器把它生成整数 0 而不是发出错误信息, 如果那个未加修饰的 0 是应该是空指针常数, 那么生成的程序不行。
 

授人以渔,不授人以鱼。
2015-10-28 21:42
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
c语言中,指针永远不能与整数互用,在需要整数的上下文使用NULL都是不合标准的,void指针只支持的操作是比较(加减法支不支持忘记了),99%的平台它是0没错,但还确实有不是0的,标准也是允许的。比如说在某平台不管是不是0,C语言只要改变宏的值就可以了,如果把它作为关键字或内建类型,最终还是要通过宏来实现。我反到觉的c++那样做是沒办法了,整数0用为指针,但看起来又像整数
2015-10-28 22:51
快速回复:指针的初始化问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015164 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved