C语言指针的形象理解-----/*自己编写*/

85 篇文章 4 订阅

此段为引用:

链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。



什么是变量?所谓变量,不要浅显的认为会变得量就是变量。套用我们院长的问话:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储空间。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但是C语言的指针,就是这个房间的地址。我们声明变量就相当于盖了间房子存放东西,我们可以直接观看房子里的东西,而声明指针,就是相当于获得了一个定位器,当用指针指向某个变量时,就是用指针给变量定位,以后我们就可以用指针找到他所“跟踪”的变量并可以获得里面的内容。


那结构体呢?结构体就相当于是有好几个房子组成的别墅,几个房子绑定在一起使用。假设现在有很多这种别墅分布在一个大迷宫里,每间别墅里都有一间房子。里面放了另一个别墅的位置信息,现在你手拿定位器找到了第一栋别墅,从里面得到了你想要的东西(链表的数据部分),然后把下一栋别墅的位置计入你的定位器(p = p->next),再走向下一栋别墅……如此走下去,知道走到某地下一栋别墅信息没有了(p->next == NULL),你的旅行结束。这就是链表一次遍历的过程。现在你能明白 p=p->next的含义了吧!


写了这么多。希望你能明白。


如果想学好c和C++,链表和指针必须熟练掌握!


以下为自己总结:

当定义一个变量 unsigned int x; 此时有两重意思:

1. 向内存申请了一块区域,申请的内存地址是&x,大小是4个byte;

2. 可以直接更改此处内存里的值,如 x=1。

在实际应用中,我们偏于意思2,只注重软件层面的理解,而忽略了意思1(硬件层面)。

而指针的使用更偏重硬件层面的意思。如上面的描述,指针就是房间的地址,指定后不管所指内存内的数据如何变化,都可以定位跟踪。


结构体的指针其实可以理解为一段内存地址的指针,这段内存的大小,由结构体内变量的定义决定。

如,unsigned char * a;   只能跟踪一个byte大小的内存;

unsigned int * b; 可以跟踪4个byte大小的内存,但这4个byte是同时被赋值的;


但如果定义结构体

struct p { 

int x,

char y,

struct a,

那 struct p * t; 结构体指针t可跟踪的是连续的一段内存,即4个byte、1个byte及另一个结构体的大小。并且可对其跟踪的内存分段,单独赋值

t->x = 1; 

t-> y = 2;

从汇编的语义上讲, p 是一個不完整的地址,或者說,半個地址,再或者說,一個指向的東西是虛構出來的地址。而 x 和 y 各是在 Point 結構中的地址偏移量。也就是說,必須有 p 和 x 或者 p 和 y 同時出現,才形成一個完整的地址,單獨的一個 p 沒有意义(转自:https://www.zhihu.com/question/49164544?sort=created)

在32位单片机中,其固件库定义寄存器地址就是用的这种方法(取代了C51的sfr)。详情可参考《零死角玩转STM32-F429》的第五章。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值