C语言指针专题——指针难学的4点缘由

前一篇跟你们聊了聊指针的概念,但是就算了解了指针是什么,为何依然感受难学?我试着从几个点切入,聊聊指针难学之处。node

文末会给你们推荐几本书,有须要的朋友能够看看!程序员

难点1. 讨厌的星号面试

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

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

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

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

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

因此*号出如今不一样的位置,有不一样的做用,这是刚开始学指针时难学的一个地方。code

难点2. 分不清址与值blog

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

还借用上面的代码,跟指针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版)

相关文章
相关标签/搜索