gliet_su 发表于 2014-5-17 11:21:41

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

很多书都把指针搞得很复杂,其实就记住一点,就可以不变以应万变。指针是存地址的。
如果指针存的是数据的地址,那么*p=该地址的数据
如果指针存的是指令的地址,那么*p=执行该条指令。

qiushui_007 发表于 2014-5-17 11:28:28

多么深刻的领悟

GodHunter 发表于 2014-5-17 11:32:12

多么痛的领悟

cumtgao 发表于 2014-5-17 11:37:31

理解得真透彻,楼主为什么不写一本指针的书呢?

ijlc1314 发表于 2014-5-17 11:57:08

多么透彻的领悟

pangzi530 发表于 2014-5-17 13:12:13

谢谢分享啦。

liuchg 发表于 2014-5-17 13:13:06

说的真心透彻啊

DevLabs 发表于 2014-5-17 13:15:31

大彻大悟.....

lrzxc 发表于 2014-5-17 13:30:51

楼主的领悟那真是经典。

zchong 发表于 2014-5-17 13:34:40

的确可以,把握本质,窒仔细分析,一般都不会出错

baiyishizi 发表于 2014-5-17 13:43:36

多么痛的领悟啊~~~

LearningASM 发表于 2014-5-17 14:14:50

悟悟悟悟悟悟悟悟悟悟悟
大切大悟

albert_w 发表于 2014-5-17 14:20:09

自学的孩子太不容易了!

Aramis 发表于 2014-5-17 16:48:12

多么痛的领悟~~~~~~~~~

煮酒fu 发表于 2014-5-17 17:49:52

p是指针变量,*p是神马?

swh267 发表于 2014-5-17 23:37:47

啊多么深的领悟,此帖必火{:lol:}{:lol:}{:lol:}

over 发表于 2014-5-17 23:42:44

多么痛的领悟。

summarize 发表于 2014-5-18 09:59:50

存的是地址,这个是通俗表达。所以专家用“指针”这个高雅的表达方式。其实改为“指向”可能更好理解,只是不高雅。

gujiamao_love 发表于 2014-5-18 10:26:07

指令包括函数的地址。

nhztb 发表于 2014-5-18 11:00:12

gujiamao_love 发表于 2014-5-18 10:26
指令包括函数的地址。

函数也是指令

myxiaonia 发表于 2014-5-18 11:32:47

*p执行指令是不对的,应该强制转换成函数指针形式

garbage哥 发表于 2014-5-18 12:08:35

太透彻了

gliet_su 发表于 2014-5-18 14:25:07

myxiaonia 发表于 2014-5-18 11:32
*p执行指令是不对的,应该强制转换成函数指针形式

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

ddqq 发表于 2014-5-18 14:57:20

多么痛的领悟

gliet_su 发表于 2014-5-18 15:09:39

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

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

licheng0620 发表于 2014-5-18 15:20:26

LZ说的极是,这也解释了为什么如果指针不初始化就使用多么danger

summarize 发表于 2014-5-18 17:15:34

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

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

tragedy 发表于 2014-5-18 18:01:34

楼主很棒,加油

wangpengcheng 发表于 2014-5-18 21:13:18

支持楼主,我也是这么过来的!

Gorgon_Meducer 发表于 2014-5-18 22:59:11

提问,地址是神马?他的本质是神马?

gliet_su 发表于 2014-5-18 23:45:44

Gorgon_Meducer 发表于 2014-5-18 22:59
提问,地址是神马?他的本质是神马?

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

myxiaonia 发表于 2014-5-18 23:51:52

Gorgon_Meducer 发表于 2014-5-18 22:59
提问,地址是神马?他的本质是神马?

地址的本质是偏移,嘿嘿

Gorgon_Meducer 发表于 2014-5-19 00:04:54

myxiaonia 发表于 2014-5-18 23:51
地址的本质是偏移,嘿嘿

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

myxiaonia 发表于 2014-5-19 00:29:52

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

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

barryliu 发表于 2014-5-19 00:41:58

p才是指针,加了*就是运算了。

LSZD 发表于 2014-5-19 00:51:45

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

帮凳子 听讲!

qlb1234 发表于 2014-5-19 08:02:54

啊痛悟蠟。

enovo2468 发表于 2014-5-19 08:24:24

指针是个好东西

kinsno 发表于 2014-5-19 09:58:34

多么痛苦的领悟!

Gorgon_Meducer 发表于 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类型的全局变量来用了……

firstelec 发表于 2014-5-19 23:14:31

楼上在炫技{:smile:},不过真明白了上面,估计也真领悟了。

our2008 发表于 2014-5-20 20:27:01

对应汇编,是否就是函数得入口地址,常量得标号地址,数表得标号地址,跳转得目标地址。

gliet_su 发表于 2014-5-20 20:50:03

our2008 发表于 2014-5-20 20:27
对应汇编,是否就是函数得入口地址,常量得标号地址,数表得标号地址,跳转得目标地址。 ...

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

armku 发表于 2014-5-22 07:23:18

大师果然高

lcl 发表于 2014-5-22 07:39:28

Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的

1、整数变成指针


不懂啊。。。。{:mad:}   继续努力。。。。。。。。。

holts2 发表于 2014-5-22 08:03:56

不一定是地址,指针也可以存变量,指针能干的事多了去

1米49 发表于 2014-5-22 08:19:01

多么痛的领悟!

tiger5 发表于 2014-5-22 08:44:27

指针和数组。

ycheng2004 发表于 2014-5-22 08:57:06

就类似如PC指针,

hyghyg1234 发表于 2014-5-22 09:07:25

lcl 发表于 2014-5-22 07:39
不懂啊。。。。   继续努力。。。。。。。。。

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

steaven2000 发表于 2014-5-22 10:46:52

不就是取数据到寄存器 跟 取数据到PC的差别嘛

jzkn 发表于 2014-5-22 11:27:53

本质是理解到了,就是要用好却不是那么容易。

随风允诺 发表于 2014-5-22 11:38:23

大学老师应该看看本贴

erpao 发表于 2014-5-22 12:10:38

有些老师就是以痛苦的方式从他的老师那里学来,再以痛苦的方式教给他的学生。

erpao 发表于 2014-5-22 12:16:02

指针就是编译器最终执行到这一步,给硬件指令,让数据寄存器三态逻辑高阻,地址寄存器接入总线。也就是取地址。对不对?

lcl 发表于 2014-5-22 19:33:51

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

谢谢指点      但。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。还是不懂{:cry:}

大力1030 发表于 2014-5-23 19:37:28

+11111111111

NanceMichael 发表于 2014-5-23 20:23:05

独孤九剑以无招胜有招,以无变应万变。

craigtao 发表于 2014-5-24 08:43:49

编码的最高境界就是设计,要设计就要抽象,这个抽象要有一个界限,太过抽象了,冯氏架构就不好实现了,人大脑的一个特点就是健忘,把细节去掉,就容易了,
但是能抽象的,都是对细节已经很把握的,

ywq 发表于 2014-5-24 08:57:10

概括的很明了,谢谢分享

songjie 发表于 2014-5-26 17:29:25

多么痛的领悟~~~~~~~~~

lyrics131415 发表于 2014-5-26 17:44:48

那**p怎么理解?

gliet_su 发表于 2014-5-26 19:37:09

lyrics131415 发表于 2014-5-26 17:44
那**p怎么理解?

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

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

lyrics131415 发表于 2014-5-27 11:52:38

gliet_su 发表于 2014-5-26 19:37
好,我们来看下什么是以不变应万变。

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


明白了,谢谢!

dashiz 发表于 2014-5-27 12:11:58

多么痛的领悟~~~~~~~~~

andmain999 发表于 2014-5-30 10:40:18

学习中。。

rockyyangyang 发表于 2014-7-18 11:04:33

好深的领悟                                 

gaoxinjun2001 发表于 2014-7-18 12:47:27

多么牛逼的领悟!!!

tgl3721 发表于 2014-7-20 21:26:47

非一般的牛B

armstrong 发表于 2014-7-20 21:48:25

恭喜楼主得出宇宙真理!

zhenghe 发表于 2014-7-20 22:34:41

不久的将来,楼主觉得现在的计算机,不就地址线、数据线、寄存器这三样

song19881218 发表于 2014-7-21 08:12:54

听君一席话,胜读十年书。大学白上了啊

gliet_su 发表于 2014-7-21 19:34:19

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

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

zl_123 发表于 2014-7-21 20:19:57

mark                        

enthier 发表于 2014-7-21 21:49:07

楼上的楼上,不能由mos管构成么?

chenting520 发表于 2014-7-21 22:22:17

int32_t wValue = ((uint32_t)phwBuffer);这是一个普通变量(不能做lvalue)p这句似乎有问题

chenting520 发表于 2014-7-21 22:28:55

wValue实际上还是一个普通变量,只是初始值等于((uint32_t)phwBuffer)而已

zhenghe 发表于 2014-7-21 22:30:13

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

好吧,楼主确实厉害

zhenghe 发表于 2014-7-21 22:33:21

如果指针是存地址的,那么指针该在哪里呢?

bailangcn 发表于 2014-7-22 10:36:49

Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的

1、整数变成指针


不愧是大湿啊

laoshuhunya 发表于 2014-7-22 11:11:07

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

ouyj_0210 发表于 2014-7-22 13:57:33

这个必须标记一个

qtds67 发表于 2014-7-22 14:15:01

痛悟宇宙真理,+10086

stevenniu500 发表于 2014-7-24 09:07:42

这貌似就是把书读厚了,又读薄了的过程吧。

myxiaonia 发表于 2014-7-24 09:15:53

enthier 发表于 2014-7-21 21:49
楼上的楼上,不能由mos管构成么?

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

zhangpisces 发表于 2014-7-24 09:17:32

C的精髓被楼主三句话给概括了,,楼主高人啊,,,,,,,多么痛的领悟。。。。

fayuanye 发表于 2014-8-8 14:02:09

{:victory:}{:victory:}{:victory:}高!!

huangchunping 发表于 2014-8-8 14:50:48

指针是难点,确实不容易

zcs 发表于 2014-8-8 15:35:31

为啥其他的都看得懂,就版主的让人半懂不懂的。

amigenius 发表于 2014-8-8 15:45:29

指针居然让这么多人觉得高深,这是中国教育的悲哀

yaoqisheng 发表于 2014-8-8 15:50:52

多么痛的领悟

pch888 发表于 2014-8-9 11:37:38

Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的

1、整数变成指针


得好好理解

zhwm3064 发表于 2014-8-9 12:15:37

Gorgon_Meducer 发表于 2014-5-19 10:46
没什么特别的

1、整数变成指针


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

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

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

硬邦邦 发表于 2014-8-9 12:20:03

谢谢分享

简单生活 发表于 2014-8-9 12:36:53

精辟啊!

戒魔 发表于 2014-8-9 12:50:29

MARK~~~~~~~~~

ly674496415 发表于 2014-8-9 13:25:32

指针存储地址的,地址的本质是个整数。mark一下

sj1125055001 发表于 2014-8-9 13:41:46

可以,中,不错

starting 发表于 2014-8-9 19:19:22

理解的太深刻了

飞扬琴声 发表于 2014-8-9 19:28:15

指针是存地址的。
页: [1] 2
查看完整版本: C语言-----指针的一点领悟