V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Ixizi
V2EX  ›  程序员

说说你对 C 语言指针的理解?

  •  
  •   Ixizi · 2015-09-30 16:55:57 +08:00 · 5393 次点击
    这是一个创建于 3340 天前的主题,其中的信息可能已经有所发展或是发生改变。

    类似的问题还可以有:

    说说你对协议(delegate)的理解?

    说说你对内存管理的理解?

    感觉答起来特费劲...

    46 条回复    2015-10-03 16:51:24 +08:00
    vietor
        1
    vietor  
       2015-09-30 17:03:00 +08:00 via Android
    对人生的理解
    neoblackcap
        2
    neoblackcap  
       2015-09-30 17:08:03 +08:00
    就一内存地址
    aprikyblue
        3
    aprikyblue  
       2015-09-30 17:17:20 +08:00
    简单理解的话当内存地址就好了。。。
    LMkillme
        4
    LMkillme  
       2015-09-30 17:21:42 +08:00
    这种问题还是很能体现出水平的,看回答,知深浅,比「 int 占几个字节」这种有固定答案的问题好多了。要问出应聘者的水平,这种问题最好了。
    holulu
        5
    holulu  
       2015-09-30 17:29:05 +08:00
    说说你对宏的理解
    SeanChense
        6
    SeanChense  
       2015-09-30 17:29:51 +08:00
    @LMkillme 那, int 占几个字节?
    holulu
        7
    holulu  
       2015-09-30 17:29:53 +08:00
    自己去翻 Pointers on C
    Mirana
        8
    Mirana  
       2015-09-30 17:30:14 +08:00
    内存地址 数据类型
    LMkillme
        9
    LMkillme  
       2015-09-30 17:30:23 +08:00
    @SeanChense 自己谷歌去
    guotie
        10
    guotie  
       2015-09-30 17:32:34 +08:00
    指针即地址
    Ixizi
        11
    Ixizi  
    OP
       2015-09-30 17:40:30 +08:00
    @LMkillme 这种题全靠自己扯... 需要清晰的思路,从天上扯到地下 而且都没 perfect 的答案..

    其实我就不知道怎么扯了,我也知道指针就一地址啊...
    ChiangDi
        12
    ChiangDi  
       2015-09-30 17:45:28 +08:00
    指针不是地址吧,是保存地址的变量。
    xiongxin8802
        13
    xiongxin8802  
       2015-09-30 17:45:31 +08:00
    `int *p = &a` (假设 int a = 10)
    嗯,指针 p 指向一个地址,在这个地址保存一个变量可以用*p 来表示,这个变量就是一堆 0101010 子类的,我们通过*p 来改变这串二进制的值就会影响到 a 的值。。。好复杂,说不清楚了
    187j3x1
        14
    187j3x1  
       2015-09-30 17:49:34 +08:00
    就记得是一种特殊变量 保存地址
    iShao
        15
    iShao  
       2015-09-30 17:53:07 +08:00 via Android
    谈谈你对异性恋的理解
    zhujinliang
        16
    zhujinliang  
       2015-09-30 17:55:41 +08:00   ❤️ 11
    指针,就是别的世界线上的记忆,
    每一条时间线上,栈上的数据随着 CPU 时钟不停地向前迭代,这是时间本来的样子
    通过指针,可以修改过去时空的记忆,从而影响当前的世界线,这是穿越时空的第 12 种方式
    是的,高效的算法,就是反复的时空跳跃,数十亿的 CPU 时钟跳动,不过是眨眼工夫的事
    当世界线收束至那必然的结果时,你是否想过那孤独的观测者
    Virtao
        17
    Virtao  
       2015-09-30 17:56:19 +08:00
    旧文一篇:
    《 C 中指针的复杂用法及阅读技巧》
    http://blog.virtao.org/articles/28.html

    帮助你理解类似下面这样的指针:

    void (*(*(*virtao)[1])(int, void(*)(int)))(int)
    jiangzhuo
        18
    jiangzhuo  
       2015-09-30 18:02:01 +08:00
    如果不知道面试官想听什么,我也不知道从哪开始说起。我就从头讲!!!
    “以前我们用 B 语言编程。。。。。。。”
    之后省略几千字
    我觉得这时候一般你说个五分钟才刚提到 C ,还有事忙的面试官就打断你了,然后给你个具体点的问题。
    lu18887
        19
    lu18887  
       2015-09-30 18:07:26 +08:00
    @LMkillme 这个貌似不是固定的噢
    LMkillme
        20
    LMkillme  
       2015-09-30 18:10:52 +08:00
    @lu18887 不算 16 位的系统的话, 32 位和 64 位系统都是 4 个字节
    suikator
        21
    suikator  
       2015-09-30 18:20:36 +08:00 via Android
    chzyer
        22
    chzyer  
       2015-09-30 18:20:42 +08:00 via iPhone
    @LMkillme 如果 64 位是 4 字节,那当逻辑内存地址位于 4G 以外的时候,怎么用 4 字节的内存空间表示?
    lu18887
        23
    lu18887  
       2015-09-30 18:22:14 +08:00   ❤️ 1
    LMkillme
        24
    LMkillme  
       2015-09-30 18:25:31 +08:00
    @chzyer 我说的是 int ,不是指针。
    hienchu
        25
    hienchu  
       2015-09-30 18:30:05 +08:00
    @ChiangDi 的确是,核心概念应该就两点,本身是变量,保存的是一个地址,指向某一内存区域。接下的深入探讨应该就看你对内存分配,数据类型等基础问题的理解了,说难不难,说简单也不简单。
    LMkillme
        26
    LMkillme  
       2015-09-30 18:30:50 +08:00
    @lu18887 开眼了,不过 ILP64 这种模式,有编译器在用么?我以前试过很多系统,结果都是 4 个字节。
    chzyer
        27
    chzyer  
       2015-09-30 18:56:40 +08:00 via iPhone
    @lu18887 牛逼!
    ffffwh
        28
    ffffwh  
       2015-09-30 19:54:30 +08:00
    底层:一个内存地址
    高层:高阶类型
    adadada
        29
    adadada  
       2015-09-30 20:10:46 +08:00
    @LMkillme mpifort 支持 ILP64 。 Intel MPI Library 用的也是 ILP64 ,其中一个原因是为了支持大数组。
    gimp
        30
    gimp  
       2015-09-30 21:49:19 +08:00
    指针 = 本身是变量,记录着别的变量的地址

    协议 ≈ 约定俗成

    内存管理 94 字面意思的说...
    sparkrat
        31
    sparkrat  
       2015-09-30 21:59:59 +08:00
    存储地址的变量.
    ryd994
        32
    ryd994  
       2015-09-30 22:06:14 +08:00
    应该友好地回应: RTFM
    Read The Friendly Manual
    test0x01
        33
    test0x01  
       2015-09-30 23:16:15 +08:00 via Android
    认真学过汇编的人表示,指针即地址的一种描述,是含目标类型说明的,是一种类型。既不等同于地址,也不等同于存地址的变量。
    rcmerci
        34
    rcmerci  
       2015-09-30 23:19:33 +08:00
    我觉得面试的时候让实现个 printf 不错。。
    onemoo
        35
    onemoo  
       2015-09-30 23:29:33 +08:00
    告诉他:在我脑中都是汇编
    Obelly
        36
    Obelly  
       2015-10-01 01:00:14 +08:00
    说了你也不懂……
    chiu
        37
    chiu  
       2015-10-01 14:05:05 +08:00
    开辟一块空间,存放地址类型的数据
    totalfee
        38
    totalfee  
       2015-10-01 21:58:12 +08:00
    遇到这种问题,要把自己当成一个讲师:“ hello 同学们好,这节课给大家讲讲《 c 语言指针》...”,这样就可以说上一节课。
    mintist
        39
    mintist  
       2015-10-02 09:46:12 +08:00
    以下是个人对指针的理解:
    首先,它是一个变量;
    其次,它存的内存的地址;
    再次,它本身附带内存地址的类型,好让你知晓类型的大小。

    PS :站在汇编的角度看,经过汇编的过程之后,就是一个内存地址,但是其所指向的类型大小是经过汇编器翻译过的。
    mintist
        40
    mintist  
       2015-10-02 10:16:40 +08:00
    对协议的理解:

    首先,协议就是不同单元通信的约定。

    比如 A 与 B 很简单的一次通信:
    A <------> B
    A 和 B 约定一个协议 1 说:我这边传的字符数据,且传过去的每个字符只要- 1 就可以原字符,然后 B 将 A 传过来的字符数据按照字符分别放在缓冲区,然后再传入一个- 1 函数,最后就通过以上的“协议”完成了通信。

    当然,真实的协议往往包括,起始,终止,校验,数据,长度等冗余信息来应对较复杂的情况。

    然后,不同的协议有不同的使用场景,且越上层设计就越复杂,考虑的因素就越多,如速度,方便和重传机制等等。

    比如用于 SoC 内部的 AMBA 总线,主要用于不同单元的互斥访问。
    再比如用于一块 PCB 板子内通信 IIC 和 SPI ,主要用于主控单元与外围器件的通信,前者具有线少一主多从的优点,但是速度慢;后者占用线多,但是速度快。(应根据使用场景决定)
    再比如用于不同主体之间通信的 USB , Ethernet 和 WiFi ,主要用于数据的传输,速度快;中着就可以组网;后者使用比较方便。

    最后,他们多说 TCP/IP 协议是很复杂的, Learn something the Hard Way ,学会这个就会对其它协议的设计理解起来就相对比较容易。
    mintist
        41
    mintist  
       2015-10-02 10:29:07 +08:00
    对内存管理的理解,还是根据使用场景来对内存进行划分。

    - 比如临时变量就放在栈里面,这段内存的属性:一般一些占用空间较小的变量和数据,用完就放
    - 系统调用的 malloc 就放在堆里面,这段内存的属性:一般大段空间内存的使用,自己拥有申请和释放的权利
    - 自己写一个内存管理器(我觉得楼主是指这个),这段内存的属性:你有如何设计如何申请和释放,当然也可以确定何时申请和释放

    PS :至于虚拟内存管理和物理内存的映射,主要是为了让多进程看起来都只有一个相同的内存空间,多一层抽象,这个使用不多,不是太了解。
    easing
        42
    easing  
       2015-10-02 15:24:52 +08:00 via Android
    就是有类型的地址
    CRVV
        43
    CRVV  
       2015-10-02 23:37:31 +08:00
    @LMkillme
    'C 语言的 int 类型占几个字节' 的答案,应该是 大于等于 2 的任意数字
    thxmem
        44
    thxmem  
       2015-10-02 23:47:27 +08:00
    (*(void(*) ())0)()
    重学 C 语言中,看到这里,今晚不想看了。
    nicegoing
        45
    nicegoing  
       2015-10-03 06:55:44 +08:00 via Android
    @thxmem 读读 C 和指针这本书,这种表达式完全不是问题。
    wizardforcel
        46
    wizardforcel  
       2015-10-03 16:51:24 +08:00
    delegate 是啥。。是 c#里那个闭包么。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3371 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 05:00 · PVG 13:00 · LAX 21:00 · JFK 00:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.