关于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赋值,如果它以某种模糊的方式改变了,编译失败,让我检查一下”

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

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

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

猜你喜欢

转载自blog.csdn.net/suxue_java/article/details/88105028