C/C++中指针是个非常底层的概念,能够进行的操作(包括破坏力)超乎想象。
问题来源于牛客网的一道题目
下面代码输出的是什么?
1 |
|
这个题目做的很犹豫,这是到现在第一次看到一个对二维数组求地址的操作,不知道表达啥意思,所以开始做错了。
可以从升维的角度来看待指针问题,每次取第一个地址,指针的视角就更高了一层。比如,对int取地址,看到了一个int数据的内存,一个一维int数组的地址,看到的是真个数组的内存空间,而一个二维数组的地址,则看到了整个二维数组的内存空间。
因此,a相当于一个行指针,能够看到二维数组的每一行,那么&a便能看到所有行的空间也就是10个int数据的内存,因此&a+1指针向后移动10个int数据的空间,也即数字10的后面,然后进行类型强制转换将int***转换成int*,因此后续ptr只能看到int内存的大小,于是ptr-2指向9,最终的值也便是9.