伙伴们注意了!
小编在这里给大家送上关注福利:
转发本文, 关注 "速学 Java" 公众号即可领取小编精心准备的资料一份!
本文总结了有关 Stack Overflow.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
来源: http://www.jianshu.com/p/a397c1acfb81