问一个初级问题:为何 C 指针这么难 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jziwenchen
V2EX    C

问一个初级问题:为何 C 指针这么难

  •  
  •   jziwenchen 2019-04-27 21:59:56 +08:00 11230 次点击
    这是一个创建于 2358 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我是从 C# / JAVA 开始学的编程 . 能从具体实例问题出发解释为何指针这么难吗?
    89 条回复    2019-04-29 14:28:15 +08:00
    smdbh
        1
    smdbh  
       2019-04-27 22:06:49 +08:00   1
    java 如何修改物理内存?
    MonoLogueChi
        2
    MonoLogueChi  
       2019-04-27 22:07:34 +08:00 via Android
    我是从 C#开始编程的,为什么 C 艹的指针这么难
    lhx2008
        3
    lhx2008  
       2019-04-27 22:08:05 +08:00
    并不难,指针是一个地址,而 Java 的变量就类似指针
    inoki
        4
    inoki  
       2019-04-27 22:09:19 +08:00 via Android
    直接操作内存的都难,试试看汇编?
    Halry
        5
    Halry  
       2019-04-27 22:13:15 +08:00 via Android   1
    不难啊
    iceheart
        6
    iceheart  
       2019-04-27 22:19:44 +08:00 via Android
    撸撸汇编就明白了
    exch4nge
        7
    exch4nge  
       2019-04-27 22:21:50 +08:00 via iPhone
    因为 C 语言更接近计算机,可以多去看一下汇编,了解一段 C 语言对应的汇编会对指针理解有所帮助。
    akira
    &nbp;   8
    akira  
       2019-04-27 22:23:47 +08:00   1
    觉得指针难的 是根本没理解内存是如何存在 如何管理的
    AngryMagikarp
        9
    AngryMagikarp  
       2019-04-27 22:25:45 +08:00
    学 C 语言一定要和操作系统原理一起学
    lookas2001
        10
    lookas2001  
       2019-04-27 22:30:27 +08:00
    大概是因为数学中没有指针这一个概念?
    多写一写程序,就懂啦~
    findmyself
        11
    findmyself  
       2019-04-27 22:30:31 +08:00 via iPhone
    指针都觉得难的话只能说 cs 基础太差了
    limuyan44
        12
    limuyan44  
       2019-04-27 22:32:46 +08:00 via Android
    因为这个问题很初级。。这才是问题,基础。
    missdeer
        13
    missdeer  
       2019-04-27 22:45:05 +08:00 via Android   2
    并不难,难的都是不实用的炫技
    syahd
        14
    syahd  
       2019-04-27 22:45:18 +08:00
    一级指针其实很简单吧,难的是三级及以上。。。。
    Northxw
        15
    Northxw  
       2019-04-27 22:47:50 +08:00
    指针真的不难,作用还很大
    kokutou
        16
    kokutou  
       2019-04-27 22:49:24 +08:00
    指针难在这个有一点绕。。。

    就跟揣摩话中话 /话背后的意思一样。。。
    reus
        17
    reus  
       2019-04-27 22:51:39 +08:00   4
    因为你没有学过计算机原理

    简单来讲就是一个内存地址

    但如果你连内存是什么都不知道,连程序怎样操作内存都不知道,那当然觉得指针难以理解

    C# / java 不让你直接操作内存,所以你没有学,所以就觉得难

    所以从 C# / java 开始学编程,就学不深入,就学不到基础知识
    WANGJIEKE
        18
    WANGJIEKE  
       2019-04-27 22:55:09 +08:00
    我觉得指针难在它提供了“非直接”的方式去访问 /修改数据,不过这也是指针作用大的原因。。。
    liwufan
        19
    liwufan  
       2019-04-27 23:09:07 +08:00   1
    为何 C 指针这么难<能从具体实例问题出发解释为何指针这么难吗?
    乞题了吧? 这题没有正确答案
    Levox
        20
    Levox  
       2019-04-27 23:37:29 +08:00
    觉得难是理解没到位吧。基础不稳就是这样。
    lynskylate
        21
    lynskylate  
       2019-04-27 23:41:35 +08:00 via Android
    单纯的指针概念不难,难在内存管理,这个指针指向对象的生命周期你很难了解,尤其是大项目,一不小心就可能忘记 free 或者 free 了非法内存。当然,这些一般有约定俗称的规矩。
    ipwx
        22
    ipwx  
       2019-04-28 00:02:52 +08:00   4
    楼上的说法都是指针不难。但我觉得并非如此,指针确实不是 elementary 的编程范式。

    这个问题的实质在于,有些程序根本不是 elementary 的编程范式能写完的。

    追求性能的算法,为了抠复杂度里面的常数,需要手工管理内存分配、需要尽可能避免条件分支带来的 cpu 流水线失效开销,需要注意 cpu 的 L1、L2、L3 缓存。这些都只有 C++ 才能搞定,Java 不行,C# 也不行。

    没错,Java 也能写算法。不用指针,用数组,用下标。实在不行就无脑 new,反正 gc 会回收。除了最后一条,C++ 也能用数组,也能用下标。但是就无法优化到流水线和缓存都妥当的程度。
    - - - -

    这里随便给你看一个 C++ 实现的哈希表,里面不仅有一级指针还有二级指针,顺便还有 memset、定长数组这种写算法题最常用的手段,你可以感受一下:

    https://gist.github.com/haowen-xu/c73fa08f6450b6d8dec9605ae0aa320a
    b00tyhunt3r
        23
    b00tyhunt3r  
       2019-04-28 00:17:01 +08:00 via iPad   1
    说不难的都是没刷过国内考研题集的 用谁还不会用啊- -;
    lance6716
        24
    lance6716  
       2019-04-28 00:40:44 +08:00 via Android
    @ipwx 这个哈希表写的挺一般啊…而且你说的那些也不是 C++写代码能搞定的,而是编译器优化的好吧。像是循环展开、条件传送啥的也跟指针没啥关系啊
    CodeCommunist
        25
    CodeCommunist  
       2019-04-28 00:45:25 +08:00 via Android
    课程编排问题,如果先学计算机组成原理和汇编就不难了
    shijingshijing
        26
    shijingshijing  
       2019-04-28 00:52:45 +08:00
    我觉得一个比较好的例子是指向函数的指针,其他的一般指向变量的指针,数组的指针其实只要理解了底层原理并不难。而函数的指针则不太一样,指向(函数的指针数组)的指针则更进了一层。

    以 Java 和 C#中的订阅模式为例,为什么发布者( Publisher )一旦达到某种条件就发布消息,订阅者( Subscriber)就能根据收到的消息执行对应的操作?实际上是因为发布者维护了一个函数的指针数组 or 链表,一旦达到某种条件,发布者就会依次执行这个函数的指针数组 or 链表中所有指针指向的函数。

    不管是 C++还是 Java 还是 C#都是基于这个原理来实现的,只是各自有不同的表述或者实现时略有差异。
    masker
        27
    masker  
       2019-04-28 01:23:40 +08:00 via Android
    我是从 PHP 开始学的编程,自考计科专业,课程有学 c,但我觉得指针并不难
    Phariel
        28
    Phariel  
       2019-04-28 01:29:45 +08:00
    你要不从 Golang 学起吧 指针这东西是有点绕
    chenjau
        29
    chenjau  
       2019-04-28 02:03:49 +08:00
    花一个月学下汇编. 8086 的汇编即可, 对于指针的了解会有很大帮助. c 是为了解决汇编的痛点而产生的. 你了解了汇编, 不但会知道指针是啥, 而且也能了解为啥要指针.
    boris1993
        30
    boris1993  
       2019-04-28 02:30:04 +08:00 via Android
    我的体会是,老师胡逼讲,打个比喻就能说明白的事,非要东扯葫芦西扯瓢整的巨 TM 复杂

    指针就是胡同门牌号(内存地址)
    指针指向的就是那个胡同的口(地址指向实际某个内存区域的起始位置)
    silvernoo
        31
    silvernoo  
       2019-04-28 02:32:39 +08:00
    难得是指针的指针的指针
    trn4
        32
    trn4  
       2019-04-28 03:08:33 +08:00 via iPhone
    指针概念本身不复杂,复杂的是实际使用的时候。从低往上学一般就不会有这种问题。
    jim9606
        33
    jim9606  
       2019-04-28 03:22:52 +08:00
    如果你是对编程概念“指针”(保存指向一个内存地址的变量)疑惑,慢慢习惯吧,因为这涉及到内存的概念。
    如果你是对 C/C++的几种引用方式疑惑(引用、左值引用、右值引用、裸指针、智能指针),我觉得这是 C/C++为了贴近底层的理念和历史遗留原因。
    GeruzoniAnsasu
        34
    GeruzoniAnsasu  
       2019-04-28 03:31:57 +08:00   13
    指针不“指”向任何东西。

    一个叫做 pointer 的东西但却一点“指”的语义都没有,还要让人去以箭头的概念想象它的作用和细节,当然会令人感到困惑。

    在我初学 C 的时候(初中)指针这一张死磕了 1 个月都没怎么看懂。一个叫做 a 的 int,它里面放了 1,要用它的时候用它的名字 a 代表它,要改它的值的时候 a=2,就行。这个语义很直观。

    但要想象一个“指针”:
    一个叫 p 的“指向 int ”的指针,它指向 a,到这里都还很好理解,可是!!
    1. a 的地址跟 p 是 tm 什么关系?
    2. p 的地址跟 p 是 tm 什么关系?
    3. p 的地址咋就又成指针了?没有东西在指它啊???
    4. 把一个箭头传进函数里是什么鬼,这个意象好难想象
    5. 蛤?修改箭头的指向本身?为什么我不能把箭头放进一个函数里让这个函数改这个箭头就完事了??
    6. 为什么修改 a 里边的值我不能把 a 传进来,必须传一个指着 a 的箭头??明明 a=2 却可以


    上面的意象中是含有矛盾的地方的(比如修改 a 的值不能使用 a 这件事)如果把指针想象成箭头,一定会陷入上面的某些困惑里。但实际上指针并不是这种东西。



    C 语言其实跟汇编极其接近,别看 C 有这么多内置类型(初中刚学的时候两周卡在第一章的数据类型上差点没放弃),实际上语义上总共也就分为两种,值和地址。

    放值的变量,就是那堆 char int float..一开始学背单词背了好久的类型
    放地址的变量,就是所谓的指针。

    指针不“指”向任何东西,它不是箭头,它仅仅是放了地址的一个变量。


    题主问的是指针为什么会这么难,本篇回复也主要想讨论为什么看起来会这么难。我对过去学习的历程一直有记忆与不断的反思,所以大概还能想起一点点当时的想法,但说实话现在已经完全没法理解到难点在哪了,全凭印象。

    实际上我接触汇编比接触 C 早,但刚开始的时候依然很难理解指针是个什么鬼东西。因为刚开始学一门语言的时候,你摸不清那些语句的语义细节和全貌是怎样的。就比如同样是闭包这种概念,有谁能说出来在 js golang python c++里,闭包 capture 的是引用还是值?一个相似的概念在不同语言里语义很可能都不一样,更别说完全陌生的东西。

    pointer 在我看来是个十分糟糕的抽象,赋予了某种完全误导的意义。如果 pointer 这种类型叫做 address type,可能理解它就完全不需要这么费劲,只需要解释一下值传递以及地址的作用就好: 参数传递时会把外面的值复制了一份放到函数里面的叫另一个名字的变量的地址上去。就算只是作为规则默认接受也要尝试用箭头的意象去理解指针然后再尝试解释为什么要用箭头才能修改函数外的变量的值要容易得多。更糟糕的是为了拟合“指针”或者“箭头”这种抽象,设计了一个真是箭头->的操作符。这个操作符完全不能解释 strcut *p; p->是在干什么。它还不如设计成 assign/binding 用的 operator,比如 let p -> a ;也要比 int *p = &a 这种看起来多此一举的 declaration 要直观得多。(当然如果能理解 declaraion 到底在“声明什么”的话还算能理解为什么得写成这样)


    所以会的人,尤其是理解了指针就是放地址的变量的人,是很难再想象到指针难点在哪的。指针很难学纯粹是因为设计时期采用了一个令人迷惑的抽象才造成了这种现象。观察一下其它的高级语言,大多数用“引用”这个概念去对变量的地址进行抽象。这个概念真的要比“指针”准确得太多,所以很少见到有人会说引用的概念很难理解或很难学。当遇到深浅拷贝的问题的时候也很容易理解复制一个地址跟复制其中的值是两码事。

    顺带一提 c++里既有从 c 继承来的指针也有跟其它高级语言无限相近的“引用”概念,题主如果还没学过的话可以猜一下“一个指向引用的指针”应该是个什么东西 のωの
    b00tyhunt3r
        35
    b00tyhunt3r  
       2019-04-28 05:35:11 +08:00 via iPad
    @GeruzoniAnsasu
    老哥写的极好,不过这句貌似有点读不通?
    “参数传递时会把外面的值复制了一份放到函数里面的叫另一个名字的变量的地址上去。”
    GeruzoniAnsasu
        36
    GeruzoniAnsasu  
       2019-04-28 06:10:03 +08:00
    @b00tyhunt3r emmm 因为这句话改过,然后漏把了字删掉了

    参数传递时,会把外面的值 复制一份,放到函数里面的 叫另一个名字的 变量的 地址 上 去
    gramyang
        37
    gramyang  
       2019-04-28 06:34:02 +08:00
    指针并不难,指针是非常的复杂,容易产生错误比如野指针。所以才用类似智能指针,GC 等一揽子自动解决方案来屏蔽对指针的操作。
    dezhou
        38
    dezhou  
       2019-04-28 06:58:53 +08:00 via Android
    你学好 java 就行了,最多看看 python
    mmdsun
        39
    mmdsun  
       2019-04-28 07:03:53 +08:00 via Android
    @reus 我记得 c#是可以用指针的。
    @MonoLogueChi
    Daming
        40
    Daming  
       2019-04-28 07:16:39 +08:00
    @mmdsun #39
    可以用指针,但是一般场景都用不到 unsafe。
    XiLemon
        41
    XiLemon  
       2019-04-28 08:00:06 +08:00 via iPhone
    看下 CSAPP 里面的第三章,有些基础的汇编内容和 C指针的讲解
    jzq526
        42
    jzq526  
       2019-04-28 08:10:03 +08:00
    指针比较难,不过多练练就好了,你可以试试写几个链表之类的练习,很快就能理解
    xuanbg
        43
    xuanbg  
       2019-04-28 08:12:14 +08:00
    指针很难理解吗?你拿张白纸画一些格子,里面写上一些数字。指针就是第 x 行第 y 列的 xy 值而不是那个格子里面写的数字。
    smallX
        44
    smallX  
       2019-04-28 08:16:11 +08:00 via Android
    JAVA 引用型变量
    MonoLogueChi
        45
    MonoLogueChi  
       2019-04-28 08:20:27 +08:00 via Android
    @mmdsun C#里是个残废的指针,而且需要 unsafe,最重要的是没有必要用指针
    babedoll
        46
    babedoll  
       2019-04-28 08:38:12 +08:00
    不难的,如果大学刚学 c 语言,去网上看看博客就懂了
    zyy314680012
        47
    zyy314680012  
       2019-04-28 08:43:37 +08:00 via Android
    指针难吗?不熟的话画图分析。
    DiamondY
        48
    DiamondY  
       2019-04-28 08:49:00 +08:00
    了解一下微机原理(计算机原理)就好了,有些概念是需要一些基础作为媒介去理解的
    wizardoz
        49
    wizardoz  
       2019-04-28 09:04:30 +08:00
    指针就是内存你地址,捋清楚了这个就不难
    xiangdong1987
        50
    xiangdong1987  
       2019-04-28 09:33:07 +08:00
    指针不难理解,但是难于使用,用好指针的都是高手
    karllynn
        51
    karllynn  
       2019-04-28 09:57:02 +08:00
    指针能有 monad 难么
    dazhangpan
        52
    dazhangpan  
       2019-04-28 10:13:07 +08:00
    指针本身就是一个存储内存地址的变量,困难的部分不是它的概念混乱或是操作复杂,而是你可以给内存中的数据不同的解释。同样一段数据 00101011101010101,可以是 int,可以是 float,也可以是某一个结构体,这完全取决于你。其实指针的本质是你如何创造运行在计算机里的这个小世界,可以参看拙文《唯识与 C 语言指针》:https://decodezp.github.io/2018/12/31/thoughts2-weishi-c-pointer/
    BingoXuan
        53
    BingoXuan  
       2019-04-28 10:17:08 +08:00
    现有架构上,所有数据都在存储设备上,当修改任何数据时候,你必须知道数据在哪。所以就抽象为指针。任何一个值都有着一个地址,或者这个值就是地址。
    luozic
        54
    luozic  
       2019-04-28 10:25:35 +08:00
    指针概念不难,但是你 Y 的程序怎麽保在各垃圾 CPU/内存上跑起很。安全+高性能才有用。
    jziwenchen
        55
    jziwenchen  
    OP
       2019-04-28 10:45:30 +08:00
    楼上说不难的 甚至自学 PHP 说指针不难的是应该没有真正在生产上写过 C 吧?

    像野指针 内存溢出 内存对齐 是不是都和操作指针有关呢?
    jziwenchen
        56
    jziwenchen  
    OP
       2019-04-28 10:46:26 +08:00
    @dazhangpan 感谢. 你说了一些本质 有具体的错误使用示范吗
    imbushuo
        57
    imbushuo  
       2019-04-28 10:51:28 +08:00
    先去理解 load/store 或者 register/memory 两个模型后你会发现指针挺简单的(
    wutiantong
        58
    wutiantong  
       2019-04-28 10:55:05 +08:00
    @jziwenchen 我打个不恰当的比方,那些在生产环境上搞出 rm -rf /* 的人会不会觉得 rm 是个很难掌握的东西呢?
    newtype0092
        59
    newtype0092  
       2019-04-28 10:57:27 +08:00   1
    一个简单的办法,不管简单还是复杂,所有声明指针变量的地方不要直接用*,要用到的指针类型全部 typedef 的清清楚楚,这样一眼就看懂了。
    tiedan
        60
    tiedan  
       2019-04-28 11:15:31 +08:00
    想起了 nginx 的四级指针。。
    jianghu52
        61
    jianghu52  
       2019-04-28 11:18:50 +08:00
    其实不是指针难,主要是楼主你学的 C# java 这种高级编程语言,把本来很复杂的编程语言给抽象的符合人类直观感觉了。所以当你学 C 的时候,指针会让你觉得很难。
    从人类可以理解的代码,到 cpu 真正执行的指令,中间隔了很多东西。每一层都是一种新的语言。而相对于来说,C 语言本身更加关注内存,所以他有指针,还有垃圾回收。而 C#还有 java 本身的环境( freamwork,jvm )他们自身已经将内存操作以及垃圾回收都已经包含了,所以指针的概念就消失了。
    这也就是为什么楼主你学习指针困难的原因。
    至于要怎么学好指针,我个人推荐的方式是去理解编译原理,不要求你真的对于编译原理有多么高深的理解,只是希望你能在头脑中真的有一个关于内存的概念。

    int a = 1
    a = 2

    以上两句 java 代码是不包含指针的,但是在内存中他们开始是什么样的,赋值之后又有了什么变化。如果你能很容易的回答出这几个问题,我觉得指针对你来说,应该就不会再觉得很难了。
    AV1
        62
    AV1  
       2019-04-28 11:34:48 +08:00 via Android
    C 语言的指针难,可能是因为* &这两个符号带来的迷惑。
    定义一个指针:
    int *p = &i;
    使用指针的时候:
    *p = i;

    在这里,两个*p 的含义是完全不一样的,这对新手来说,会造成很大的困扰。
    Cukuyo
        63
    Cukuyo  
       2019-04-28 11:39:44 +08:00
    听说 nginx 之所以快是因为里面用的四级指针来着
    fromdark
        64
    fromdark  
       2019-04-28 11:58:28 +08:00
    指针本身并不难,之所以难是因为大部分学校的老师教的很烂,教材也用的很烂(比如某谭),基本上 C 的学习都是应试驱动,考题也考一些乱七八糟的东西。选择一本好书,指针并不难。
    qqor
        65
    qqor  
       2019-04-28 12:25:33 +08:00 via Android   1
    一群人曾经谩骂 c++高手指针乱指的问题,看来到现在这问题还没解决
    dingyaguang117
        66
    dingyaguang117  
       2019-04-28 12:26:02 +08:00
    指针不难,难的是内存管理
    q397064399
        67
    q397064399  
       2019-04-28 13:08:55 +08:00
    因为你没学汇编语言,C 语言说的好听的就是高级一点点的汇编语言,本身只在汇编上面包装了一点点东西而已
    chitanda
        68
    chitanda  
       2019-04-28 13:28:51 +08:00 via Android
    不难吧。有指针可以做到很多优化。比如 Python 合并两有序列表,用 iter 不能退回到上一个,指针直接--就行了
    littlewing
        69
    littlewing  
       2019-04-28 13:30:58 +08:00
    先学计算机组成原理,再学汇编,然后学 C 你就会觉得很简单了
    q397064399
        70
    q397064399  
       2019-04-28 13:59:49 +08:00
    C 语言 = 汇编语言 ,, 两者一定要同时一起学
    Cloutain
        71
    Cloutain  
       2019-04-28 15:05:37 +08:00
    完全称不上难,搞清楚各种内存布局和操作系统的内存管理才叫难。脚本语言一样,脚本语言从某种程度上实现近似指针的功能就和汇编语言没有多大的区别了。
    jackmod
        72
    jackmod  
       2019-04-28 15:21:33 +08:00
    C 语言不是一门语言,而是它背后的一整套体系。建议阅读 CSAPP。
    salamanderMH
        73
    salamanderMH  
       2019-04-28 15:43:10 +08:00
    C 语法不难吧
    myself659
        74
    myself659  
       2019-04-28 17:03:44 +08:00
    加一层原理 indirect 了解一下
    phoolean
        75
    phoolean  
       2019-04-28 18:16:43 +08:00
    你应该说一下这个“难”指的是概念上难以理解还是使用时难以操作?
    如果是概念上难以理解,可能是因为计算机原理没学好;
    如果是使用时难以操作,可能是因为写的代码少了不够熟练。
    kahohuru
        76
    kahohuru  
       2019-04-28 18:50:12 +08:00 via Android
    是挺难的,当年写个植物大战僵尸的外挂就用到了指针
    dfjslkjdf
        77
    dfjslkjdf  
       2019-04-28 19:45:06 +08:00
    是不是因为容易出错?
    wtdd
        78
    wtdd  
       2019-04-28 20:04:40 +08:00
    指针的本意很容易理解,难的是那些操作以及符号,设计的比较奇怪
    fghjghf
        79
    fghjghf  
       2019-04-28 21:24:58 +08:00
    完全因为你没了解指针而已。你了解透了,会觉得 C 很简单。CPP 的语法才是最烦人的。面向对象、过程、范型,
    ixiaohei
        80
    ixiaohei  
       2019-04-29 00:53:08 +08:00
    @smdbh unsafe 黑科技啊
    qiukun
        81
    qiukun  
       2019-04-29 08:24:07 +08:00 via Android
    内存是一个 byte 数组,指针存 index,*号可以取对应内容,&某变量可以取地址(内存上的 index)
    that's all
    exploreXin
        82
    exploreXin  
       2019-04-29 09:26:55 +08:00
    内存地址比喻成酒杯,那么地址里存的值就是酒,酒杯装酒,这是很好理解的。但是你见过装酒杯的酒杯吗,也就是酒杯里装的是酒杯,这就是指针变量的大致比喻,因为生活中不长见到这样的场景,所以也就不好理解了。如果要深入理解指针,前置知识有计算机体系结构,计算机硬件知识,另外还要有一些操作系统的知识打底,才能充分理解指针,觉得指针难理解只是前置知识不够,如果这些前置知识你都学的很溜的话,指针也就迎刃而解了,只是目前市面上大多都是业务逻辑程序员,函数类库都有人给封装好了,拿来直接用就行了,没有机会直接面对底层问题,所以对指针会很疑惑。
    no1xsyzy
        83
    no1xsyzy  
       2019-04-29 09:36:07 +08:00
    简单复杂
    方便麻烦
    这是两个不同的维度
    其实 C 是简单而麻烦,而未经封装的指针正是麻烦的根源。
    一种通用的封装叫做引用,正是 Java 的核心。
    notreami
        84
    notreami  
       2019-04-29 10:20:53 +08:00   1
    都不专业啊,说难或者不难的,上代码啊。。
    扯犊子半天,写 ppt 嘛?
    ismyyym
        85
    ismyyym  
       2019-04-29 11:17:02 +08:00
    有人故意炫技,就会很难。

    我武汉一 985 的,大学时计算机组成原理和汇编考试都 90+,但当时看很多代码,还是头晕。
    marsgt
        86
    marsgt  
       2019-04-29 13:01:28 +08:00
    C 是老大哥,老大哥踩过的坑,后边小辈肯定就默默的绕过去了啊。。。所以 C 一开始就相当于没有任何任何优化,到了后边像是 C++、Java 啥的就都会或多或少在语法上进行了改进,所以你如果先学的是后边的,再学前边就会觉得原始。但其实 C 更多的会更贴合硬件的设计,所以掌握硬件原理以后,相对的学起来会对理解有所帮助~(但并不是说会了硬件学 C 就没压力了,只是有帮助而已;硬件由会到懂,这个阶段可以很长。。)
    marsgt
        87
    marsgt  
       2019-04-29 13:10:38 +08:00
    而且好教材真的很少。。♂
    国产就不说了,大学接触过某位老同志的基本上都踩坑了吧。。唯一我看过一本还能看的是《 C 语言编程魔法书》,是讲 C11 的(很新哦)。
    欧美译的大部头,有单讲指针的可以看看;日译的有本《明解 C 语言》,只看过几眼。不过就我对日译作品的整体观感而言,可以一看~
    acgzy
        88
    acgzy  
       2019-04-29 13:19:23 +08:00
    先学习汇编的话指针就更容易理解了
    ttgasia
        89
    ttgasia  
       2019-04-29 14:28:15 +08:00
    @acgzy 非常赞成。
    C 语言更像是直接从汇编进化来的,而 C#/JAVA 则是多次进化的结果。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5186 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 43ms UTC 09:26 PVG 17:26 LAX 02:26 JFK 05:26
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86