指针啊指针问题。

[复制链接]
5795|29
 楼主| 刚注册 发表于 2009-8-18 17:44 | 显示全部楼层 |阅读模式
问题:
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就不行?!
chen3bing 发表于 2009-8-18 18:20 | 显示全部楼层
你可以这样写:
int *p;
  p=10;
  *p=100;
这是C语言的语法。
xwj 发表于 2009-8-18 20:00 | 显示全部楼层
因为考虑到不同的存储空间,指针并不是单纯的一个地址偏移,还要包含存储空间信息。

这点在嵌入式系统中更是普遍,比如:
Keil中的执政就是3个字节的。
踢球老越位 发表于 2009-8-18 20:11 | 显示全部楼层
2# chen3bing 这样的写法依然错误!
NULL之所以行,因为定义了#define NULL    ((void *)0),我是在visual Studio 下编译的
 楼主| 刚注册 发表于 2009-8-18 21:22 | 显示全部楼层
#define NULL 0
OR
#define NULL ((void *)0)

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

好像指针不应该直接给値!

TO XWJ:
怎么包含存储空间信息?AVR PIC 下举个例子吧?!不是C51
HWM 发表于 2009-8-19 08:11 | 显示全部楼层
指针是有“类型”的!必须符合强制类型匹配。
 楼主| 刚注册 发表于 2009-8-19 08:32 | 显示全部楼层
int *p=0x0010;

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

至于指针本身的数据类型是由编译器自己确定的把!?

请HWM和XWJ等大虾指导指导,俺一看到这样的强制转换和函数指针什么的就发晕了,看书也看不懂啊,哪个大侠能不能写个入门型读材。

拜托了。
HWM 发表于 2009-8-19 08:53 | 显示全部楼层
“0x0010”的类型和“p”的类型不符。
 楼主| 刚注册 发表于 2009-8-19 08:59 | 显示全部楼层
啊,那为什么直接写NULL可以呢?

NULL也是一个数值啊。
chen3bing 发表于 2009-8-19 09:14 | 显示全部楼层
踢球老越位老兄,我那样写在C51下编译调试是正确的。
HWM 发表于 2009-8-19 09:27 | 显示全部楼层
回楼主: “0”是一个特殊的玩意儿,可以作为“空指针”——即“NULL”。那东东没心没肺没类型。
yewuyi 发表于 2009-8-19 09:47 | 显示全部楼层
回楼主: “0”是一个特殊的玩意儿,可以作为“空指针”——即“NULL”。那东东没心没肺没类型。
HWM 发表于 2009-8-19 09:27


呵呵,这个解释好!
冷漠 发表于 2009-8-19 11:07 | 显示全部楼层
本帖最后由 冷漠 于 2009-8-19 12:41 编辑

我们教授也没讲明白,还是毕业后自己弄懂的。
0x0010叫作匿名指针或者抽象指针,可以查查清华教授写的单片机C方面的书。

int  *p=0x0010;   //实际上说明的是:右值0x0010是一个int类型,而不是指针类型。
相当于类型int X=0x0010;  // 等效于X=*p=0x0010;
也即表达的是: *p=0x0010;  //int数值0x0010.
上式等效于   &*p=&0x0010;

即   p=&0x0010;   //p是地址&

与LZ希望表达的 p=0x0010; 大相庭径了。


正确写法:
int data  *p;
p=(int data *)0x10;
*p=100;

或者:
#include<absacc.h>
DBYTE[0x10]=100;
HWM 发表于 2009-8-19 11:47 | 显示全部楼层
楼上:严格来说,强类型匹配就已经说明了问题(语法不容许),至于其他杜撰出来的“语~义~解~释”(原谅这种写法,否则会被戴绿帽的)没有实际意义。只有0(NULL)除外。
dudongdao 发表于 2009-8-19 12:26 | 显示全部楼层
原因就一个,大家都说了,0和其他的数不一样,那不一样 你就别放一起比。
   那为啥不一样呢?这是编译器决定的,不是个人决定的。你用这个编译器就按规矩来。
win2000_li 发表于 2009-8-19 12:38 | 显示全部楼层
学习。。。。。。。。。。。。。。。。。
冷漠 发表于 2009-8-19 13:55 | 显示全部楼层
转了半天,LZ说的是对的。0x0010就是个地址。只是匿名指针0x0010 一定要加上存储类型data/xdata等等。(不加有警告,也能运行。)

void main()   
{
int data *p=0x0010;       // 和p=(int data *)0x0010;  一样
*p=100;
while(1);
}
mohanwei 发表于 2009-8-19 15:01 | 显示全部楼层
编译器定的规则,你只能去遵守。

例如VC里变量可以随处定义(函数长的时候可读性强),但Keil,IAR里都不行……
 楼主| 刚注册 发表于 2009-8-19 15:49 | 显示全部楼层
我们教授也没讲明白,还是毕业后自己弄懂的。
0x0010叫作匿名指针或者抽象指针,可以查查清华教授写的单片机C方面的书。

int  *p=0x0010;   //实际上说明的是:右值0x0010是一个int类型,而不是指针类型。
相当于类 ...
冷漠 发表于 2009-8-19 11:07


你这一段又把俺弄晕了。
俺的意思就是:把RAM空间的0x0010这个地址放到指针变量里面去,例如int *p=&a;
这句的意思是把变量a的地址放到指针变量p里面,也就是指向a,但a的地址也就是一个数值,所以我想为什么不能把数值赋给指针变量p呢?!
但我这样写:int *p=0x0010;在很多编译器下都是不能编译的。
 楼主| 刚注册 发表于 2009-8-19 15:50 | 显示全部楼层
请问18楼,编译器在这个问题上的具体规则是怎么样的?!

怎么没有什么书讲这个东西?!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部