搜索
bottom↓
回复: 131

C语言-----指针的一点领悟

  [复制链接]

出0入0汤圆

发表于 2014-5-17 11:21:41 | 显示全部楼层 |阅读模式
很多书都把指针搞得很复杂,其实就记住一点,就可以不变以应万变。指针是存地址的
如果指针存的是数据的地址,那么*p=该地址的数据
如果指针存的是指令的地址,那么*p=执行该条指令。

出0入0汤圆

发表于 2014-5-17 11:28:28 | 显示全部楼层
多么深刻的领悟

出0入0汤圆

发表于 2014-5-17 11:32:12 | 显示全部楼层
多么痛的领悟

出0入0汤圆

发表于 2014-5-17 11:37:31 | 显示全部楼层
理解得真透彻,楼主为什么不写一本指针的书呢?

出0入0汤圆

发表于 2014-5-17 11:57:08 来自手机 | 显示全部楼层
多么透彻的领悟

出0入0汤圆

发表于 2014-5-17 13:12:13 | 显示全部楼层
谢谢分享啦。

出0入0汤圆

发表于 2014-5-17 13:13:06 | 显示全部楼层
说的真心透彻啊

出0入0汤圆

发表于 2014-5-17 13:15:31 来自手机 | 显示全部楼层
大彻大悟.....

出0入0汤圆

发表于 2014-5-17 13:30:51 来自手机 | 显示全部楼层
楼主的领悟那真是经典。

出0入31汤圆

发表于 2014-5-17 13:34:40 | 显示全部楼层
的确可以,把握本质,窒仔细分析,一般都不会出错

出0入0汤圆

发表于 2014-5-17 13:43:36 | 显示全部楼层
多么痛的领悟啊~~~

出0入0汤圆

发表于 2014-5-17 14:14:50 | 显示全部楼层
悟悟悟悟悟悟悟悟悟悟悟
大切大悟

出0入42汤圆

发表于 2014-5-17 14:20:09 | 显示全部楼层
自学的孩子太不容易了!

出0入0汤圆

发表于 2014-5-17 16:48:12 | 显示全部楼层
多么痛的领悟~~~~~~~~~

出0入0汤圆

发表于 2014-5-17 17:49:52 | 显示全部楼层
p是指针变量,*p是神马?

出0入0汤圆

发表于 2014-5-17 23:37:47 | 显示全部楼层
啊多么深的领悟,此帖必火

出0入0汤圆

发表于 2014-5-17 23:42:44 | 显示全部楼层
多么痛的领悟。

出0入0汤圆

发表于 2014-5-18 09:59:50 | 显示全部楼层
存的是地址,这个是通俗表达。所以专家用“指针”这个高雅的表达方式。其实改为“指向”可能更好理解,只是不高雅。

出0入0汤圆

发表于 2014-5-18 10:26:07 | 显示全部楼层
指令包括函数的地址。

出0入0汤圆

发表于 2014-5-18 11:00:12 来自手机 | 显示全部楼层
gujiamao_love 发表于 2014-5-18 10:26
指令包括函数的地址。

函数也是指令

出0入0汤圆

发表于 2014-5-18 11:32:47 来自手机 | 显示全部楼层
*p执行指令是不对的,应该强制转换成函数指针形式

出0入0汤圆

发表于 2014-5-18 12:08:35 | 显示全部楼层
太透彻了

出0入0汤圆

 楼主| 发表于 2014-5-18 14:25:07 | 显示全部楼层
myxiaonia 发表于 2014-5-18 11:32
*p执行指令是不对的,应该强制转换成函数指针形式

*p只是说明指向P这一地址的执行,调用指针函数这样写当然是不对的。

出0入0汤圆

发表于 2014-5-18 14:57:20 来自手机 | 显示全部楼层
多么痛的领悟  

出0入0汤圆

 楼主| 发表于 2014-5-18 15:09:39 | 显示全部楼层
summarize 发表于 2014-5-18 09:59
存的是地址,这个是通俗表达。所以专家用“指针”这个高雅的表达方式。其实改为“指向”可能更好理解,只是 ...

其实很多东西就是屌丝,硬要说成高富帅,让人云里雾里。
像溢出,泄露。其本质就是操作过界了。

出0入0汤圆

发表于 2014-5-18 15:20:26 | 显示全部楼层
LZ说的极是,这也解释了为什么如果指针不初始化就使用多么danger

出0入0汤圆

发表于 2014-5-18 17:15:34 | 显示全部楼层
gliet_su 发表于 2014-5-18 15:09
其实很多东西就是屌丝,硬要说成高富帅,让人云里雾里。
像溢出,泄露。其本质就是操作过界了。 ...

指针的英文原名是 Pointer,所以应该翻译为“指向器”更好吧

出0入0汤圆

发表于 2014-5-18 18:01:34 来自手机 | 显示全部楼层
楼主很棒,加油

出0入0汤圆

发表于 2014-5-18 21:13:18 | 显示全部楼层
支持楼主,我也是这么过来的!

出0入296汤圆

发表于 2014-5-18 22:59:11 | 显示全部楼层
提问,地址是神马?他的本质是神马?

出0入0汤圆

 楼主| 发表于 2014-5-18 23:45:44 | 显示全部楼层
Gorgon_Meducer 发表于 2014-5-18 22:59
提问,地址是神马?他的本质是神马?

连版主都来了,看来还蛮火的哈。
地址就是程序存贮对应的位置,即程序存在哪里。
若是flash,程序就存在flash地址对应的空间上,RAM同理。
常见的地址空间0x0000_0000~0x4000_0000,指针存的就是这些地址的值。

出0入0汤圆

发表于 2014-5-18 23:51:52 来自手机 | 显示全部楼层
Gorgon_Meducer 发表于 2014-5-18 22:59
提问,地址是神马?他的本质是神马?

地址的本质是偏移,嘿嘿

出0入296汤圆

发表于 2014-5-19 00:04:54 | 显示全部楼层
myxiaonia 发表于 2014-5-18 23:51
地址的本质是偏移,嘿嘿

地址的本质只是个整数…没意识到这个,都白学指针了…也不能发挥指针的优势…

出0入0汤圆

发表于 2014-5-19 00:29:52 | 显示全部楼层
Gorgon_Meducer 发表于 2014-5-19 00:04
地址的本质只是个整数…没意识到这个,都白学指针了…也不能发挥指针的优势… ...

此话按藏玄机啊,请指点一二

出0入0汤圆

发表于 2014-5-19 00:41:58 | 显示全部楼层
p才是指针,加了*就是运算了。

出0入0汤圆

发表于 2014-5-19 00:51:45 | 显示全部楼层
Gorgon_Meducer 发表于 2014-5-19 00:04
地址的本质只是个整数…没意识到这个,都白学指针了…也不能发挥指针的优势… ...

帮凳子 听讲!

出0入0汤圆

发表于 2014-5-19 08:02:54 | 显示全部楼层
啊痛悟蠟。

出0入0汤圆

发表于 2014-5-19 08:24:24 | 显示全部楼层
指针是个好东西

出0入0汤圆

发表于 2014-5-19 09:58:34 | 显示全部楼层
多么痛苦的领悟!

出0入296汤圆

发表于 2014-5-19 10:46:53 | 显示全部楼层
LSZD 发表于 2014-5-19 00:51
帮凳子 听讲!

没什么特别的

1、整数变成指针

一个普通变量
uint32_t wValue = 0x12345678;

我们把这个变量变成指针
((uint8_t *)wValue)   这就是一个指向uint8_t类型的指针,指针目前的值是0x12345678

2、指针变整数
uint16_t *phwBuffer = &xxxxxx;   这是一个指向uint16_t类型的指针,目前已经指向了某个地址

uint32_t wValue = ((uint32_t)phwBuffer);  这是一个普通变量(不能做lvalue)

3、常数变地址
这是一个常数0x12345678

先变成指针常量  ((float *)0x12345678)

然后把指针常量变成全局变量  
(*((float *)0x12345678))

这就是一个float类型的全局变量,地址是0x12345678,
我们再给他加一个名字

#define EXAMPLE_REG    (*((float *)0x12345678))
从此,EXAMPLE_REG就可以当做普通float类型的全局变量来用了……

出0入0汤圆

发表于 2014-5-19 23:14:31 | 显示全部楼层
楼上在炫技,不过真明白了上面,估计也真领悟了。

出50入10汤圆

发表于 2014-5-20 20:27:01 来自手机 | 显示全部楼层
对应汇编,是否就是函数得入口地址,常量得标号地址,数表得标号地址,跳转得目标地址。

出0入0汤圆

 楼主| 发表于 2014-5-20 20:50:03 | 显示全部楼层
our2008 发表于 2014-5-20 20:27
对应汇编,是否就是函数得入口地址,常量得标号地址,数表得标号地址,跳转得目标地址。 ...

对的,汇编是一个go to就能解决,用指针只能*p了。

出0入0汤圆

发表于 2014-5-22 07:23:18 来自手机 | 显示全部楼层
大师果然高

出0入0汤圆

发表于 2014-5-22 07:39:28 | 显示全部楼层
Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的

1、整数变成指针

不懂啊。。。。   继续努力。。。。。。。。。

出0入0汤圆

发表于 2014-5-22 08:03:56 | 显示全部楼层
不一定是地址,指针也可以存变量,指针能干的事多了去

出0入0汤圆

发表于 2014-5-22 08:19:01 | 显示全部楼层
多么痛的领悟!

出0入0汤圆

发表于 2014-5-22 08:44:27 | 显示全部楼层
指针和数组。

出0入30汤圆

发表于 2014-5-22 08:57:06 | 显示全部楼层
就类似如PC指针,

出0入0汤圆

发表于 2014-5-22 09:07:25 | 显示全部楼层
lcl 发表于 2014-5-22 07:39
不懂啊。。。。   继续努力。。。。。。。。。

用软件仿真,跟踪下值你就能发现了,你定义的变量都有对应的地址值,那个就是指针指向的方向了

出0入0汤圆

发表于 2014-5-22 10:46:52 | 显示全部楼层
不就是取数据到寄存器 跟 取数据到PC的差别嘛

出0入0汤圆

发表于 2014-5-22 11:27:53 | 显示全部楼层
本质是理解到了,就是要用好却不是那么容易。

出0入0汤圆

发表于 2014-5-22 11:38:23 | 显示全部楼层
大学老师应该看看本贴

出0入0汤圆

发表于 2014-5-22 12:10:38 来自手机 | 显示全部楼层
有些老师就是以痛苦的方式从他的老师那里学来,再以痛苦的方式教给他的学生。

出0入0汤圆

发表于 2014-5-22 12:16:02 来自手机 | 显示全部楼层
指针就是编译器最终执行到这一步,给硬件指令,让数据寄存器三态逻辑高阻,地址寄存器接入总线。也就是取地址。对不对?

出0入0汤圆

发表于 2014-5-22 19:33:51 | 显示全部楼层
hyghyg1234 发表于 2014-5-22 09:07
用软件仿真,跟踪下值你就能发现了,你定义的变量都有对应的地址值,那个就是指针指向的方向了 ...

谢谢指点      但。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。还是不懂

出0入0汤圆

发表于 2014-5-23 19:37:28 | 显示全部楼层
+11111111111

出0入0汤圆

发表于 2014-5-23 20:23:05 | 显示全部楼层
独孤九剑以无招胜有招,以无变应万变。

出0入0汤圆

发表于 2014-5-24 08:43:49 | 显示全部楼层
编码的最高境界就是设计,要设计就要抽象,这个抽象要有一个界限,太过抽象了,冯氏架构就不好实现了,人大脑的一个特点就是健忘,把细节去掉,就容易了,
但是能抽象的,都是对细节已经很把握的,

出0入0汤圆

发表于 2014-5-24 08:57:10 | 显示全部楼层
概括的很明了,谢谢分享

出0入0汤圆

发表于 2014-5-26 17:29:25 | 显示全部楼层
多么痛的领悟~~~~~~~~~

出0入0汤圆

发表于 2014-5-26 17:44:48 | 显示全部楼层
那**p怎么理解?

出0入0汤圆

 楼主| 发表于 2014-5-26 19:37:09 | 显示全部楼层

好,我们来看下什么是以不变应万变。

p是存地址的,没问题。那么*p=?。
假设p存的地址是0x12345。那么*p取的就是0x12345这一地址所存的数,假设这个数是0x6789。
所以**p=*(0x6789)。也许觉得奇怪,指向一个0x6789得到的是什么?
再次强调指针变量是存地址的,所以0x6789也必须是一个地址。如果0x6789不是地址,编译器会警告,或报错。
最终*(0x6789)=取0x6789这一地址所存的数。

出0入0汤圆

发表于 2014-5-27 11:52:38 | 显示全部楼层
gliet_su 发表于 2014-5-26 19:37
好,我们来看下什么是以不变应万变。

p是存地址的,没问题。那么*p=?。

明白了,谢谢!

出0入0汤圆

发表于 2014-5-27 12:11:58 | 显示全部楼层
多么痛的领悟~~~~~~~~~

出0入0汤圆

发表于 2014-5-30 10:40:18 | 显示全部楼层
学习中。。

出0入0汤圆

发表于 2014-7-18 11:04:33 | 显示全部楼层
好深的领悟                                 

出0入0汤圆

发表于 2014-7-18 12:47:27 | 显示全部楼层
多么牛逼的领悟!!!

出0入0汤圆

发表于 2014-7-20 21:26:47 | 显示全部楼层
非一般的牛B

出870入263汤圆

发表于 2014-7-20 21:48:25 | 显示全部楼层
恭喜楼主得出宇宙真理!

出0入0汤圆

发表于 2014-7-20 22:34:41 | 显示全部楼层
不久的将来,楼主觉得现在的计算机,不就地址线、数据线、寄存器这三样

出0入0汤圆

发表于 2014-7-21 08:12:54 | 显示全部楼层
听君一席话,胜读十年书。大学白上了啊

出0入0汤圆

 楼主| 发表于 2014-7-21 19:34:19 | 显示全部楼层
zhenghe 发表于 2014-7-20 22:34
不久的将来,楼主觉得现在的计算机,不就地址线、数据线、寄存器这三样

错,都是三极管组成的。再怎么NB的逻辑电路都是由三极管组成的,至少现阶段还不能突破。

出0入0汤圆

发表于 2014-7-21 20:19:57 | 显示全部楼层
mark                        

出0入0汤圆

发表于 2014-7-21 21:49:07 来自手机 | 显示全部楼层
楼上的楼上,不能由mos管构成么?

出0入0汤圆

发表于 2014-7-21 22:22:17 来自手机 | 显示全部楼层
int32_t wValue = ((uint32_t)phwBuffer);  这是一个普通变量(不能做lvalue)  p这句似乎有问题

出0入0汤圆

发表于 2014-7-21 22:28:55 来自手机 | 显示全部楼层
wValue实际上还是一个普通变量,只是初始值等于((uint32_t)phwBuffer)而已

出0入0汤圆

发表于 2014-7-21 22:30:13 | 显示全部楼层
gliet_su 发表于 2014-7-21 19:34
错,都是三极管组成的。再怎么NB的逻辑电路都是由三极管组成的,至少现阶段还不能突破。 ...

好吧,楼主确实厉害

出0入0汤圆

发表于 2014-7-21 22:33:21 | 显示全部楼层
如果指针是存地址的,那么指针该在哪里呢?

出0入0汤圆

发表于 2014-7-22 10:36:49 | 显示全部楼层
Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的

1、整数变成指针

不愧是大湿啊

出0入0汤圆

发表于 2014-7-22 11:11:07 | 显示全部楼层
指针仅仅是存储单元的编号(也叫地址)而已,这个编号一般使用“整数”表示。
针对某种处理器(CPU、MCU)的编译器,int 类型的长度一般并不表示机器的自然字长,而是要求其至少能表示这个“整数”地址。
例如:8051单片机是8位机,ALU是8位的,机器的自然字长是8位,而KEIL C51编译器的int 类型定义为16位,是因为8051的地址空间是16位的。对ARM 32位CPU,这个规则也一样。
C语言在设计之初已经考虑了这些情况。
  

出0入0汤圆

发表于 2014-7-22 13:57:33 | 显示全部楼层
这个必须标记一个

出0入0汤圆

发表于 2014-7-22 14:15:01 | 显示全部楼层
痛悟宇宙真理,+10086

出0入0汤圆

发表于 2014-7-24 09:07:42 | 显示全部楼层
这貌似就是把书读厚了,又读薄了的过程吧。

出0入0汤圆

发表于 2014-7-24 09:15:53 | 显示全部楼层
enthier 发表于 2014-7-21 21:49
楼上的楼上,不能由mos管构成么?

好吧,lz说晶体管的话就不会有这样的疑问了

出0入0汤圆

发表于 2014-7-24 09:17:32 | 显示全部楼层
C的精髓被楼主三句话给概括了,,楼主高人啊,,,,,,,多么痛的领悟。。。。

出0入0汤圆

发表于 2014-8-8 14:02:09 | 显示全部楼层
高!!

出0入0汤圆

发表于 2014-8-8 14:50:48 | 显示全部楼层
指针是难点,确实不容易

出0入0汤圆

发表于 2014-8-8 15:35:31 | 显示全部楼层
为啥其他的都看得懂,就版主的让人半懂不懂的。

出140入158汤圆

发表于 2014-8-8 15:45:29 | 显示全部楼层
指针居然让这么多人觉得高深,这是中国教育的悲哀

出0入0汤圆

发表于 2014-8-8 15:50:52 | 显示全部楼层
多么痛的领悟

出0入0汤圆

发表于 2014-8-9 11:37:38 | 显示全部楼层
Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的

1、整数变成指针

得好好理解

出0入0汤圆

发表于 2014-8-9 12:15:37 来自手机 | 显示全部楼层
Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的

1、整数变成指针

我的理解能力差,还是不能理解指针。
我的感觉指针就像汇编语言里面的“间接寻址”
不过,程序的指针又不能用间接寻址。

我最初写程序从来不用指针,我现在写程序已经离不开指针了,特别是大型程序,多任务程序,菜单程序,链表结构,调度器等等(其实就是一个调度器,里面包含链表结构的菜单,并实现多任务处理)。这些程序每个部分都用到指针,非常好用。调度器是用指针实现的,链表菜单也是指针实现的,多任务的实现又是指针实现的。

但是,我还是不能透彻理解指针。指针是个令人头疼的问题,应用时,我只有复制过去,再修改代码了。

出0入10汤圆

发表于 2014-8-9 12:20:03 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-8-9 12:36:53 | 显示全部楼层
精辟啊!

出0入0汤圆

发表于 2014-8-9 12:50:29 | 显示全部楼层
MARK~~~~~~~~~

出0入0汤圆

发表于 2014-8-9 13:25:32 | 显示全部楼层
指针存储地址的,地址的本质是个整数。mark一下

出0入0汤圆

发表于 2014-8-9 13:41:46 | 显示全部楼层
可以,中,不错

出0入0汤圆

发表于 2014-8-9 19:19:22 | 显示全部楼层
理解的太深刻了

出0入0汤圆

发表于 2014-8-9 19:28:15 | 显示全部楼层
指针是存地址的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 22:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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