说说你对 C 语言指针的理解? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Ixizi
V2EX    程序员

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

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

    类似的问题还可以有:

    说说你对协议(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 ,其中一个原因是为了支持大数组。
        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     Solana     5072 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 09:33 PVG 17:33 LAX 01:33 JFK 04:33
    Do have faith in what you're doing.
    ubao msn 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