美文网首页程序员
关于C/ c++指针的5大问题

关于C/ c++指针的5大问题

作者: suxueJ | 来源:发表于2019-03-04 11:16 被阅读0次

    伙伴们注意了!

    小编在这里给大家送上关注福利:

    转发本文,关注“速学Java”公众号即可领取小编精心准备的资料一份!

    本文总结了有关stackoverflow.com上的C/ c++指针的常见问题。

    指针是C/ c++中最令人困惑的部分,这些问题使用简单的例子来解释关键指针的概念。

    1. 不用循环从1数到1000

    计算1到1000的唯一其他方法是使用递归。

    根据C语言,j在开始时的值是“1”。

    当1 <= j < 1000时,&main + (&exit - &main)*(j/1000)总是计算到&main,这是main的内存地址。

    (&main)(j+1)是我们想要得到的下一个迭代,它将在屏幕上打印“2”,等等。

    这个递归的停止条件是当j达到1000时,&main + (&exit - &main)*(j/1000)的值是&exit,它将优雅地退出这个进程,并将错误代码1001返回到操作系统。

    2. 为什么a[5] == 5[a]?

    a[b]指C标准中的*(a+b)。

    a是基址,b是从a开始的偏移量。a[b]是a+b地址中的值。

    因此,a+5和5+a是相同的内存地址。

    它们的值*(a+5)和*(5+a)是一样的。

    所以a[5] == 5[a]

    3.指针可以有多少层?

    人类能承受的极限。任何c/c++编译器都肯定支持更多。

    4. C指针指向数组/数组指针消歧

    下列声明有何不同:

    通过C优先表,array [], function return()优先于指针*。

    为int * arr1 [8

    ]arr1首先是一个数组,不管元素的类型是什么。

    在应用指针*之后,我们知道arr1是一个int指针数组。

    int(* arr2)[8]

    根据方括号覆盖规则,在本例中指针*的优先级高于array[]。

    那么arr2首先是一个指针,无论它指向什么。

    在应用array[]之后,我们知道arr2是指向int数组的指针。

    int * (arr3 [8])

    在本例中,括号不改变任何默认优先级,因此它与int* arr1[8]相同

    5. const指针的意义是什么?

    (1) void foo(int* const ptr);

    (2) void foo(int* ptr);

    对于foo的调用者,ptr的值同时(1)和(2)拷贝到foo中。

    (1)和(2)只对foo的实现者有影响,而不是foo的客户端。

    在(2)中,实现者可能会意外更改ptr的值,这可能会引入bug。

    (1)就像实现者在写foo的主体之前对编译器说,“嘿,我不想给ptr赋值,如果它以某种模糊的方式改变了,编译失败,让我检查一下”

    最后,想学习Java的小伙伴们!

    关注速学java公众号就可以拿到一份我为大家准备的Java学习资料!

    对Java感兴趣的小伙伴也可以加 小编V❤: suxuejava

    相关文章

      网友评论

        本文标题:关于C/ c++指针的5大问题

        本文链接:https://www.haomeiwen.com/subject/quubuqtx.html