关于C/ c++指针的5大问题
伙伴们注意了!
小编在这里给大家送上关注福利:
转发本文,关注“速学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赋值,如果它以某种模糊的方式改变了,编译失败,让我检查一下”