一道C语题做错后的探究
本人先声明自己是菜鸟,也不是学计算机专业的(我的专业是法律)。可能以下内容有错误,如有请大神指正,小弟将感激不尽。 我有网上看到一道题内容如下: inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); A 1,2 B 2,5 C 2,1 D 1,5
刚开始时我觉得这个应该选C,但是我错了,这道题应该选B。看了别人的答案才知道ptr 指向的是数组a最后一个元素的下一个元素,这让我很意外。通过我对数组和指针的认识并作了一个假想现已验证假设是正确的。
假想:对于这个数组*(&a+1)为这数组最后一个元素的下一个元素,*(&a+2)为2个数组长度的下一个元素,*(&a+3)为3个……………… 之所以有这样的假设是受*(a+1)是数组下一个元素的启发。因为数组是int型的,所以(a+1)时指针就移动4个字节。那么(&a+1)时指针就移动一个数组的长度。
验证:先设定一段代码去验证这个假想。 #include<stdio.h> Int main() { int a[5]={1,2,3,4,5}; print(“这个数组的长度为:%d\n”,sizeof(a)); print(“数组第一个元素地址为:%p\n”,&a); print(“(&a+1)时指针移动到:%p\n”, (&a+1)); print(“(&a+2)时指针移动到:%p\n”, (&a+2)); print(“(&a+3)时指针移动到:%p\n”, (&a+3)); print(“(&a+4)时指针移动到:%p\n”, (&a+4)); return 0; }
打印出后的结果为: 这个数组的长度为:20 数组第一个元素地址为:0012ff4c (&a+1)时指针移动到:0012ff60 (&a+2)时指针移动到: 0012ff74 (&a+3)时指针移动到:0012ff88 数组第一个元素地址为:0012ff4c 转换10进制后 1245004 (&a+1)时指针移动到:0012ff60 转换10进制后 1245024 (&a+2)时指针移动到:0012ff74 转换10进制后 1245044 (&a+3)时指针移动到:0012ff88 转换10进制后 1245064 1245024-1245004=20(等于数组长度) 1245044-1245024=20(等于数组长度) 1245064-1245044=20(等于数组长度) 从以上数据可以验证之前的假想是正确的,希望这点分析能对大家有些帮助。
|