曾经进公司面试的C语言有关指针和数组的笔试题

原题如下:

#include <stdio.h>

int main(void)
{
	int i , j ; 
	unsigned int Array_A[32];
	unsigned int *pPointer;
	i = 0x0008 ;
	//测试i
	printf("i=%d\n",i) ;
	
	pPointer = Array_A ;
	*(pPointer++)=i++ ;
	//测试i 
	printf("i=%d\n",i) ;
	
	j= Array_A[0];
	printf("#j:%d\n",j);   //# 
	*(pPointer) = i ;
	j = Array_A[1];
	printf("##j:%d\n",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个元素的位置里去了。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值