迷惑中过的C语言的指针问题

[复制链接]
2456|5
 楼主| biehoff 发表于 2008-10-13 15:21 | 显示全部楼层 |阅读模式
指针就是地址&nbsp;&nbsp;我是这么理解的&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;如果定义一个&nbsp;char&nbsp;变量&nbsp;&nbsp;char&nbsp;a&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;那么&nbsp;很明显定义指向他的指针&nbsp;&nbsp;&nbsp;char&nbsp;*p;&nbsp;*p=a;&nbsp;<br />p的值就是a的地址吧&nbsp;我笨笨的举例&nbsp;a是char型的a的内容是0x20&nbsp;地址在0x10那么p的值就是0x10了&nbsp;&nbsp;&nbsp;书上说&nbsp;char&nbsp;*p&nbsp;是定义一个指向&nbsp;char型变量的指针变量&nbsp;知道p是指向char型的变量&nbsp;但是我觉得没有理由说p也是char型的&nbsp;&nbsp;如果内存地址都是16位的&nbsp;从0x0000到0xffff&nbsp;就算里面每个单元是byte&nbsp;8位&nbsp;那么地址也都是16位的&nbsp;&nbsp;也就是刚才说的&nbsp;p的应该是&nbsp;short&nbsp;int&nbsp;型的&nbsp;值是0x0010&nbsp;<br />&nbsp;其实指针也是个变量吧&nbsp;也是需要存放的&nbsp;貌似从&nbsp;char&nbsp;*p;&nbsp;*p=a&nbsp;这两句只能说明&nbsp;p是装a的地址&nbsp;具体p是多少位的地址&nbsp;那就由系统硬件决定&nbsp;所以我就认为char&nbsp;*p&nbsp;是定义p&nbsp;指向目标的类型&nbsp;而没决定p的类型&nbsp;<br />如果不这么想&nbsp;好象没法解释44b0初始化程序的一句&nbsp;<br />&nbsp;&nbsp;#define&nbsp;rUTXH0&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;char&nbsp;*)0x1d00020)<br />UTXH0是UART的&nbsp;发送保持寄存器&nbsp;地址是32位的&nbsp;但里面装的内容是个byte&nbsp;8位<br />&nbsp;&nbsp;&nbsp;<br />不知道这么理解对不对&nbsp;&nbsp;大侠们指点下
玄德 发表于 2008-10-13 16:16 | 显示全部楼层

你理解的很对。

没错,p是装a的地址&nbsp;具体p是多少位的地址&nbsp;那就由系统硬件决定。p的位数视芯片类型而变,可以是16位,也可以是32位,在51里是16位,在DSP2407里也是16位,但DSP2812就是32位的。p的位数实际上是由编译器设定的。
sxggj 发表于 2008-10-13 16:44 | 显示全部楼层

写的太多了,看的累

char&nbsp;*p===========(char*)p,从你最后那个实例中应该能看出来括号在哪儿,所以说char*类型的指针当然是跟char型变量占用的字节是一样的了
sanwa_chen 发表于 2008-10-13 16:52 | 显示全部楼层

p不是char类型的,是指向char类型的‘指针’

p不是char类型的,是指向char类型的‘指针’。<br /><br />简单的例子来说吧<br /><br />char&nbsp;a[10]&nbsp;=&nbsp;{0,1,2,3,4,5,6,7,8,9];<br />char&nbsp;*p;<br /><br />&nbsp;&nbsp;p&nbsp;=&nbsp;&a[0];<br />/*<br />假设a[]地址从0x1000开始,如下<br />0x1000:<br />00&nbsp;01&nbsp;02&nbsp;03&nbsp;04&nbsp;05&nbsp;06&nbsp;07&nbsp;08&nbsp;09<br /><br />不同的系统下a[0]&nbsp;的地址长度是不尽一样的,当你定义了&nbsp;char&nbsp;*p时,并不是说&nbsp;p&nbsp;就是&nbsp;8&nbsp;位的,而是说&nbsp;p&nbsp;这个地址里存放的内容是&nbsp;char型的(8位的),当做如下运算的时候<br />*/<br /><br />&nbsp;p++;//因为p是指向char型的(8位),所以该处以8位(1Byte)为步进递加指针<br />&nbsp;//这时&nbsp;*p&nbsp;==&nbsp;0x01;&nbsp;<br />&nbsp;如果定义&nbsp;为:&nbsp;int&nbsp;*p;<br />&nbsp;那p++;以后&nbsp;p是以16位(2Byte)为步进递加指针的,这时*p&nbsp;==&nbsp;0x0203(或者0x0302)<br /><br />以上是粗略的一个例子,说法不是很精确,只是个大概意思<br />仔细看看书上的描述,你就会清楚很多。<br /><br />
 楼主| biehoff 发表于 2008-10-13 17:06 | 显示全部楼层

thanks

谢谢各位大侠&nbsp;这下明白了&nbsp;&nbsp;本人太菜&nbsp;还要多努力&nbsp;&nbsp;虽然学习和理解的办法很笨
sxggj 发表于 2008-10-14 09:00 | 显示全部楼层

看来我更菜了,谢谢大侠

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

138

帖子

0

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