| 一道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(等于数组长度) 从以上数据可以验证之前的假想是正确的,希望这点分析能对大家有些帮助。 
 |