本文总结了有关stackoverflow.com上有关C / C ++指针的首要问题。指针是C / C ++中最令人困惑的部分,这些问题使用简单的示例来解释关键指针概念。
1.在不使用循环的情况下从1到1000计数
#include <stdio.h>
#include <stdlib.h>
void main (int j ){
printf (“%d \ n ” , j );
(& main + (&exit - & main )* ( j / 1000 ))( j + 1 );
}
计数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.为什么[5] == 5 [a]?
a [b]表示C标准的*(a + b)。a是基址,b是从a开始的偏移量。a [b]是a + b的地址中的值。
因此,+ 5和5 + a是相同的存储器地址。它们的值*(a + 5)和*(5 + a)是相同的。所以[5] == 5 [a]
3.我们可以拥有多少级别的指针?
和人类一样可以处理。任何c / c ++编译器肯定都支持更多。
4.指向数组/指针数组的C指针消歧
以下声明之间有什么区别:
int * arr1 [ 8 ] ;
int (* arr2 )[ 8 ] ;
int * ( arr3 [ 8 ] );
通过C优先级表,array [],函数return()优先于指针*。
对于int * arr1 [8],
arr1首先是一个数组,无论元素是什么类型。在应用指针*之后,我们知道arr1是一个int指针数组。
对于int(* arr2)[8]
通过括号覆盖规则,在这种情况下,指针*优先于array []。然后arr2首先是一个指针,无论它指向什么。在应用array []之后,我们知道arr2是一个指向int数组的指针。
对于int *(arr3 [8])
在这种情况下,Bracket不会更改任何默认优先级,因此它与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的值。
(1)就像实现者在编写foo体之前对编译器说的那样,“嘿,我不想重视ptr,如果以某种模糊的方式改变它,让编译失败,让我检查一下”
另外本人从事在线教育多年,将自己的资料整合建了一个QQ群,对于有兴趣一起交流学习C/C++的初学者可以加群:825414254,里面有大神会给予解答,也会有许多的资源可以供大家学习分享,欢迎大家前来一起学习进步!
网友评论