前一篇跟大家聊了聊指针的概念,可是就算了解了指针是什么,为什么依然感觉难学?我试着从几个点切入,聊聊指针难学之处。

文末会给大家推荐几本书,有需要的朋友可以看看!

难点1. 讨厌的星号

定义指针变量p时,都会加个*号。在用到指针变量p时,也会加个*号。比如以下代码:

int main()
{
int *p;
p = malloc(sizeof(int));
*p = 1; return 0;
}

程序定义了一个指针变量p,前面有个*号;后面给指针p指向的内存区域赋值1,又有个*号,这两个*号有啥区别呢?很多初学者在这里会搞不懂。

定义指针p时,前面的*号只是告诉编译器,p是个指针,其它没什么用处。我个人一直认为,当初发明C语言时,定义指针p时不应该用*来说明,你可以用@号,用#号,用$号,随便用什么号来说明p是个指针,这样就不会与下面用到指针p时的*混淆了。

*p = 1这个语句的*号,起到的作用就是跨过指针p自己的值,直捣黄龙,取得指针p指向的存储区域。关于指针p自己的值,和指针p指向的值,可以参考我之前的文章。

所以*号出现在不同的位置,有不同的作用,这是刚开始学指针时难学的一个地方。

难点2. 分不清址与值

这里的址就是地址,就是很多教材喜欢说的指针变量是个地址,地址,地址。。。。地你妹啊,谁看得懂什么地址地址地址的!而值,就是指针p指向的数据。

还借用上面的代码,跟指针p相关的数据就两个,一个是指针p自己的值,程序中是明显看不到的,是程序运行时操作系统才能看到的,指针p自己的值就是教材中提到很多次的“地址”;另一个就是指针p指向的值,程序中就是常量“1”。

本文原创,发表于知乎专栏,欢迎转发!

我认为很多教材只会讲地址,地址,地址,根本就没有讲清这个“址”与“值”这两者的区别,谁搞得懂。

难点3. 借助址来读值

指针有自己的值的概念,有指向的值的概念,两者的关系也是让初学者迷糊的。指针要借助自己的值,去找到指向的值,也就是借助址来读取值。

就像上面的代码片段,假设指针p自己的值是0x12345678,这就是一个内存区域的地址,借助这个址,再结合星号,就可以将整数1放在0x12345678这块内存中了。此时,指针p借助自己的值(0x12345678)指向了一个值(1)。

呵呵,借址读(写)值,已经让人晕了。

难点4. 链表结点

如果上述3点还不算变态的话,那么结合链表这种数据结构,那就相当的变态了。

比如链表的结点往往定义为一个结构体,就像这样:

struct node

{

    int i;

    struct node *next;

}

然后会有什么建立链表啊,插入链表啊,删除链表啊,哪一个操作不会用到指针next?

本来链表操作就让人烦了,再加上指针这个东东,真是烦上加烦。

可不是嘛,比如定义了一个结点变量指针p,如下

struct node *p;

然后你就会看到满程序都有p->next,说不定还有其它的结点变量指针q,再来个p->next = q->next,或者q->next = p->next,让人眼花缭乱,能不烦不。

本文先提这4点指针难点,也许还有其它的难点,本文也不赘述了。不管怎样,指针虽难,但是只要理解其本质,那么理解指针,或者理解一段包含指针的代码,或者写一段含有指针的代码,只是时间问题。

好书推荐:

1. 2017.9.全国计算机C语言等级考试上机新版题库、模拟试卷

2. C Primer Plus 第6版 中文版

3. 程序员面试宝典(第5版)

C语言指针专题——指针难学的4点原因的更多相关文章

  1. C语言指针专题——指针怎么就很灵活?

    最近在研读 C Primer pkus(第五版)中文版,老外写的还是很经典的,推荐给朋友们,购买地址:C primer plus 5版中文版购买 另外再推荐两本书: 1. 2017年9月全国计算机二级 ...

  2. C语言指针专题——序

    看到好多的C语言初学者学到指针时,都觉得指针怎么那么难啊!我也想起了我当时学习指针时遇到的困难,确实很难!到底是教程写的不好呢,还是老师教的不好呢?我觉得都有. 网上搜索指针讲解的资料很多,我也看了不 ...

  3. C语言指针专题——为何要学习指针

    欢迎转发本文! 之前的文章与各位谈论了指针是什么,以及指针为何这那么难学.不少知友留言说看了我的文章对指针了解了不少,这给我继续创作提供了莫大的动力啊.指针其实就是一个纸老虎,你看着可怕,等你了解其本 ...

  4. C语言指针专题——使用指针要注意这些

    本文为原创,欢迎转发: 欢迎关注微博与微信号:C语言编程技术分享 C语言中,指针的概念有点难懂,使用起来稍微不注意,也会遇到各种问题.在本文中,我列举出了几个使用指针不当的方式,希望朋友们在编程实践中 ...

  5. <<C语言--神奇的指针>>

    指针很简单 ------引子 学计算机语言,首先推荐C语言.无论是数据结构还是算法,站在C语言的角度,会让我们理解的更加清晰透彻. 但是,指针不太"友好",让很多人抓狂,头疼.不少 ...

  6. C语言指针篇(一)指针与指针变量

    指针 1. 什么是指针?    2. 指针可不可怕? 3. 指针好不好玩? 4. 怎么学好指针?     C语言是跟内存打交道的语言,指针就是内存地址.指针无处不在,指针并不可怕,相反,等你学到一定程 ...

  7. C语言整理复习——指针

    指针是C的精华,不会指针就等于没学C.但指针又是C里最难理解的部分,所以特意写下这篇博客整理思路. 一.指针类型的声明 C的数据类型由整型.浮点型.字符型.布尔型.指针这几部分构成.前四种类型比较好理 ...

  8. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  9. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

随机推荐

  1. Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测

    原文:Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测  [函数名称] Hough 变换直线检测         HoughLineDetect(WriteableBit ...

  2. C#获取带汉字的字符串长度

    正常情况下,我们是直接去string的length的,但是汉字是有两个字节的,所以直接用length是错的.如下图: 所以应该用以下代码来获取长度: private void button1_Clic ...

  3. ztree的树形结构不能正常显示原因

    1.ztree树形结构不能正常显示情况如下: 2.原因之一:未给其类添加 ztree 原因二:未引用ztree的css样式 <link href="~/Content/CSS/zTre ...

  4. Python杂谈: __init__.py的作用

    我们经常在python的模块目录中会看到 "__init__.py"  这个文件,那么它到底有什么作用呢? 1. 标识该目录是一个python的模块包(module package ...

  5. QT 序列化/串行化/对象持久化

    本文以一个实例讲解Qt的序列化方法: Qt版本 4.8.0 Qt序列化简介 Qt采用QDataStream来实现序列化,QT针对不同的实例化对象有不同的要求.这里主要分两类,即:QT中原生的数据类型, ...

  6. Delphi事件的广播

    原文地址:Delphi事件的广播 转作者:MondaySoftware 明天就是五一节了,辛苦了好几个月,借此机会应该尽情放松一番.可是想到Blog好久没有写文章,似乎缺些什么似的.这几个月来在项目中 ...

  7. 插件化二(Android)

    插件化二(Android) 上一篇文章<插件化一(android)>里大概构思了下插件加载与校验的流程和一些大体设计,这次就具体展开,在<动态加载与插件化>里提到以apk形式开 ...

  8. jquery 之load post get

    load() 方法从服务器加载数据,并把返回的数据放入被选元素中 load(url,data,fun(responseTxt ,responseTxt,xhr ){}) 必需的 URL 参数规定您希望 ...

  9. SYN6105型 GPS子钟

    SYN6105型 GPS子钟 产品概述 SYN6105型GPS子钟是由西安同步电子科技有限公司精心设计.自行研发生产的一套以接收GPS卫星信号的子钟,从GPS地球同步卫星上获取标准时钟信号信息将这些时 ...

  10. 玩转java多线程(wait和notifyAll的正确使用姿势)

    转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...