曾经进公司面试的C语言有关指针和数组的笔试题
原题如下:
#include <stdio.h> int main(void) { int i , j ; unsigned int Array_A[32]; unsigned int *pPointer; i = 0x0008 ; //测试i printf("i=%d ",i) ; pPointer = Array_A ; *(pPointer++)=i++ ; //测试i printf("i=%d ",i) ; j= Array_A[0]; printf("#j:%d ",j); //# *(pPointer) = i ; j = Array_A[1]; printf("##j:%d ",j); //## return 0 ; }
这个题目问你#和##的结果分别是什么?
结果如下:
为什么是这样?为什么#这个j不是9而是8?
一说起这个问题,其实就是在考查数组的基本问题,我们看看这行代码:
pPointer = Array_A ;
这行代码其实就是将数组名赋值给一个指针pPointer , 因为数组有空间,所以这里相当于给指针隐式的分配了空间,我们就不用去malloc申请内存了。
其实数组名是一个常量左值,常量左值就意味着值是一个常量,且不能被修改,而Array_A[0]是数组首元素,它是左值,但可以修改。
由此可知:数组首地址是数组本身的地址,而数组的第0个元素是第0个元素这个值的值的地址。
那么*(pPointer++)= i++其实就是将i自加前的值写到了数组第0个元素的位置去了。我们都知道是后加,所以数组的第0个元素保存的是i++之前的值,也就是8 ,保存到了数组的第0个元素的位置。所以#j就等于8 ,##j是i++之后的值也就是9,保存到了数组的第1个元素的位置里去了。
原题如下: #include上一篇:
Java基础知识总结(2021版)
下一篇:
面试问题(乐观锁和悲观锁的区别)