C语言-----指针的一点领悟
很多书都把指针搞得很复杂,其实就记住一点,就可以不变以应万变。指针是存地址的。如果指针存的是数据的地址,那么*p=该地址的数据
如果指针存的是指令的地址,那么*p=执行该条指令。
多么深刻的领悟 多么痛的领悟 理解得真透彻,楼主为什么不写一本指针的书呢? 多么透彻的领悟 谢谢分享啦。 说的真心透彻啊 大彻大悟..... 楼主的领悟那真是经典。 的确可以,把握本质,窒仔细分析,一般都不会出错 多么痛的领悟啊~~~ 悟悟悟悟悟悟悟悟悟悟悟
大切大悟 自学的孩子太不容易了! 多么痛的领悟~~~~~~~~~ p是指针变量,*p是神马? 啊多么深的领悟,此帖必火{:lol:}{:lol:}{:lol:} 多么痛的领悟。 存的是地址,这个是通俗表达。所以专家用“指针”这个高雅的表达方式。其实改为“指向”可能更好理解,只是不高雅。 指令包括函数的地址。 gujiamao_love 发表于 2014-5-18 10:26
指令包括函数的地址。
函数也是指令 *p执行指令是不对的,应该强制转换成函数指针形式 太透彻了 myxiaonia 发表于 2014-5-18 11:32
*p执行指令是不对的,应该强制转换成函数指针形式
*p只是说明指向P这一地址的执行,调用指针函数这样写当然是不对的。 多么痛的领悟 summarize 发表于 2014-5-18 09:59
存的是地址,这个是通俗表达。所以专家用“指针”这个高雅的表达方式。其实改为“指向”可能更好理解,只是 ...
其实很多东西就是屌丝,硬要说成高富帅,让人云里雾里。
像溢出,泄露。其本质就是操作过界了。 LZ说的极是,这也解释了为什么如果指针不初始化就使用多么danger gliet_su 发表于 2014-5-18 15:09
其实很多东西就是屌丝,硬要说成高富帅,让人云里雾里。
像溢出,泄露。其本质就是操作过界了。 ...
指针的英文原名是 Pointer,所以应该翻译为“指向器”更好吧 楼主很棒,加油 支持楼主,我也是这么过来的! 提问,地址是神马?他的本质是神马? Gorgon_Meducer 发表于 2014-5-18 22:59
提问,地址是神马?他的本质是神马?
连版主都来了,看来还蛮火的哈。
地址就是程序存贮对应的位置,即程序存在哪里。
若是flash,程序就存在flash地址对应的空间上,RAM同理。
常见的地址空间0x0000_0000~0x4000_0000,指针存的就是这些地址的值。 Gorgon_Meducer 发表于 2014-5-18 22:59
提问,地址是神马?他的本质是神马?
地址的本质是偏移,嘿嘿 myxiaonia 发表于 2014-5-18 23:51
地址的本质是偏移,嘿嘿
地址的本质只是个整数…没意识到这个,都白学指针了…也不能发挥指针的优势… Gorgon_Meducer 发表于 2014-5-19 00:04
地址的本质只是个整数…没意识到这个,都白学指针了…也不能发挥指针的优势… ...
此话按藏玄机啊,请指点一二 p才是指针,加了*就是运算了。 Gorgon_Meducer 发表于 2014-5-19 00:04
地址的本质只是个整数…没意识到这个,都白学指针了…也不能发挥指针的优势… ...
帮凳子 听讲! 啊痛悟蠟。 指针是个好东西 多么痛苦的领悟! 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类型的全局变量来用了……
楼上在炫技{:smile:},不过真明白了上面,估计也真领悟了。 对应汇编,是否就是函数得入口地址,常量得标号地址,数表得标号地址,跳转得目标地址。 our2008 发表于 2014-5-20 20:27
对应汇编,是否就是函数得入口地址,常量得标号地址,数表得标号地址,跳转得目标地址。 ...
对的,汇编是一个go to就能解决,用指针只能*p了。 大师果然高 Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的
1、整数变成指针
不懂啊。。。。{:mad:} 继续努力。。。。。。。。。 不一定是地址,指针也可以存变量,指针能干的事多了去 多么痛的领悟! 指针和数组。
就类似如PC指针, lcl 发表于 2014-5-22 07:39
不懂啊。。。。 继续努力。。。。。。。。。
用软件仿真,跟踪下值你就能发现了,你定义的变量都有对应的地址值,那个就是指针指向的方向了{:titter:} 。 不就是取数据到寄存器 跟 取数据到PC的差别嘛 本质是理解到了,就是要用好却不是那么容易。 大学老师应该看看本贴 有些老师就是以痛苦的方式从他的老师那里学来,再以痛苦的方式教给他的学生。 指针就是编译器最终执行到这一步,给硬件指令,让数据寄存器三态逻辑高阻,地址寄存器接入总线。也就是取地址。对不对? hyghyg1234 发表于 2014-5-22 09:07
用软件仿真,跟踪下值你就能发现了,你定义的变量都有对应的地址值,那个就是指针指向的方向了 ...
谢谢指点 但。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。还是不懂{:cry:} +11111111111 独孤九剑以无招胜有招,以无变应万变。 编码的最高境界就是设计,要设计就要抽象,这个抽象要有一个界限,太过抽象了,冯氏架构就不好实现了,人大脑的一个特点就是健忘,把细节去掉,就容易了,
但是能抽象的,都是对细节已经很把握的, 概括的很明了,谢谢分享 多么痛的领悟~~~~~~~~~ 那**p怎么理解? lyrics131415 发表于 2014-5-26 17:44
那**p怎么理解?
好,我们来看下什么是以不变应万变。
p是存地址的,没问题。那么*p=?。
假设p存的地址是0x12345。那么*p取的就是0x12345这一地址所存的数,假设这个数是0x6789。
所以**p=*(0x6789)。也许觉得奇怪,指向一个0x6789得到的是什么?
再次强调指针变量是存地址的,所以0x6789也必须是一个地址。如果0x6789不是地址,编译器会警告,或报错。
最终*(0x6789)=取0x6789这一地址所存的数。
gliet_su 发表于 2014-5-26 19:37
好,我们来看下什么是以不变应万变。
p是存地址的,没问题。那么*p=?。
明白了,谢谢! 多么痛的领悟~~~~~~~~~ 学习中。。 好深的领悟 多么牛逼的领悟!!! 非一般的牛B 恭喜楼主得出宇宙真理! 不久的将来,楼主觉得现在的计算机,不就地址线、数据线、寄存器这三样 听君一席话,胜读十年书。大学白上了啊 zhenghe 发表于 2014-7-20 22:34
不久的将来,楼主觉得现在的计算机,不就地址线、数据线、寄存器这三样
错,都是三极管组成的。再怎么NB的逻辑电路都是由三极管组成的,至少现阶段还不能突破。 mark 楼上的楼上,不能由mos管构成么? int32_t wValue = ((uint32_t)phwBuffer);这是一个普通变量(不能做lvalue)p这句似乎有问题 wValue实际上还是一个普通变量,只是初始值等于((uint32_t)phwBuffer)而已 gliet_su 发表于 2014-7-21 19:34
错,都是三极管组成的。再怎么NB的逻辑电路都是由三极管组成的,至少现阶段还不能突破。 ...
好吧,楼主确实厉害 如果指针是存地址的,那么指针该在哪里呢? Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的
1、整数变成指针
不愧是大湿啊 指针仅仅是存储单元的编号(也叫地址)而已,这个编号一般使用“整数”表示。
针对某种处理器(CPU、MCU)的编译器,int 类型的长度一般并不表示机器的自然字长,而是要求其至少能表示这个“整数”地址。
例如:8051单片机是8位机,ALU是8位的,机器的自然字长是8位,而KEIL C51编译器的int 类型定义为16位,是因为8051的地址空间是16位的。对ARM 32位CPU,这个规则也一样。
C语言在设计之初已经考虑了这些情况。
这个必须标记一个 痛悟宇宙真理,+10086 这貌似就是把书读厚了,又读薄了的过程吧。 enthier 发表于 2014-7-21 21:49
楼上的楼上,不能由mos管构成么?
好吧,lz说晶体管的话就不会有这样的疑问了 C的精髓被楼主三句话给概括了,,楼主高人啊,,,,,,,多么痛的领悟。。。。 {:victory:}{:victory:}{:victory:}高!! 指针是难点,确实不容易 为啥其他的都看得懂,就版主的让人半懂不懂的。 指针居然让这么多人觉得高深,这是中国教育的悲哀 多么痛的领悟 Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的
1、整数变成指针
得好好理解 Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的
1、整数变成指针
我的理解能力差,还是不能理解指针。
我的感觉指针就像汇编语言里面的“间接寻址”
不过,程序的指针又不能用间接寻址。
我最初写程序从来不用指针,我现在写程序已经离不开指针了,特别是大型程序,多任务程序,菜单程序,链表结构,调度器等等(其实就是一个调度器,里面包含链表结构的菜单,并实现多任务处理)。这些程序每个部分都用到指针,非常好用。调度器是用指针实现的,链表菜单也是指针实现的,多任务的实现又是指针实现的。
但是,我还是不能透彻理解指针。指针是个令人头疼的问题,应用时,我只有复制过去,再修改代码了。 谢谢分享 精辟啊! MARK~~~~~~~~~ 指针存储地址的,地址的本质是个整数。mark一下 可以,中,不错 理解的太深刻了 指针是存地址的。
页:
[1]
2