为什么写成NULL

[复制链接]
 楼主| 发表于 2019-2-19 15:59 | 显示全部楼层 |阅读模式
问题:
1、int *p=NULL;
*p=100;
NULL是一个宏定义,定义如下:#define NULL 0
我这样理解:第一句句的意思是定义指针变量p,p指向0x0000这个地址,第二句的意思为给0x0000这个地址赋值为100
2、假如我现在想让p指向0x0010这个地址并赋值为100,为什么我这样写会出错:
int *p=0x0010; *p=100;

但改成如下int *p=(int *)(0x0010); *p=100; 这样编译后测试正确。

从道理上讲,int *p=0x0010; 应该也是可以的把?为什么写成NULL就可以,写成0x0010就不行?!
发表于 2019-2-19 16:02 | 显示全部楼层
因为考虑到不同的存储空间,指针并不是单纯的一个地址偏移,还要包含存储空间信息。

这点在嵌入式系统中更是普遍,比如:
Keil中的执政就是3个字节的
发表于 2019-2-19 16:08 | 显示全部楼层

这样的写法依然错误!
NULL之所以行,因为定义了#define NULL    ((void *)0),我是在visual Studio 下编译的
 楼主| 发表于 2019-2-19 16:12 | 显示全部楼层
#define NULL 0
OR
#define NULL ((void *)0)

好像是按照第一个方式定义的吧?如果按照第二句定义似乎还好理解点。

好像指针不应该直接给値!
发表于 2019-2-19 16:15 | 显示全部楼层

怎么包含存储空间信息?
发表于 2019-2-19 16:18 | 显示全部楼层
指针是有“类型”的!必须符合强制类型匹配。
 楼主| 发表于 2019-2-19 16:23 | 显示全部楼层

int *p=0x0010;

如上这样的定义已经确定了指针变量的类型了把?

至于指针本身的数据类型是由编译器自己确定的吧
发表于 2019-2-19 16:26 | 显示全部楼层
“0x0010”的类型和“p”的类型不符。
发表于 2019-2-19 16:30 | 显示全部楼层


原因就一个,大家都说了,0和其他的数不一样,那不一样 你就别放一起比。
      那为啥不一样呢?这是编译器决定的,不是个人决定的。你用这个编译器就按规矩来。
发表于 2019-2-19 16:38 | 显示全部楼层
LZ说的是对的。0x0010就是个地址。只是匿名指针0x0010 一定要加上存储类型data/xdata等等。(不加有警告,也能运行。)

void main()   
{
int data *p=0x0010;       // 和p=(int data *)0x0010;  一样
*p=100;
while(1);
}
发表于 2019-2-19 16:41 | 显示全部楼层
编译器定的规则,你只能去遵守。
发表于 2019-2-19 16:44 | 显示全部楼层
哇靠,LZ太牛B了,指针都没学明白就敢滥用指针
发表于 2019-2-19 17:52 | 显示全部楼层

#define NULL ((*void)0)

指针是一种数据类型,所以是有类型 的;
发表于 2019-2-19 17:56 | 显示全部楼层
把空指针,野指针,无类型指针,指针的赋值操作和指针引用注意事件弄清楚再用吧

否则程序功能不正常可以调试到哭都哭不出来,哈哈
发表于 2019-2-19 18:01 | 显示全部楼层
好像早期C语言里int *p=0x0010这样是合法的,编译器自动将整形转换为指针地址,没有任何问题。
发表于 2019-2-19 18:05 | 显示全部楼层
唯一的例外是0,将一个指针赋值为0是一个很常见的用法
发表于 2019-2-19 18:07 | 显示全部楼层
嗯,所以编译器特别允许整数0以及(void *)0到任意指针的转换。
 楼主| 发表于 2019-2-19 18:10 | 显示全部楼层

嗯,我知道了,多谢哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1018

主题

9067

帖子

3

粉丝
快速回复 返回顶部 返回列表