分析以下程序,输出结果 2,5

#include<stdio.h>
int main() {
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
    return 0;
}

分析:

a 代表的是int * 每次步长为一个int;

&a 代表的是 int[]* 每次步长为所指向的数组的大小。(&a是数组指针,其类型是int(*)[5])

ptr 指向的是数组a最后一个元素的下一个元素

所以ptr-1指向的是数组a的最后一个元素

*(a+1)指向的是数组a的第二个元素,等价于a[1]。

 

补充:对数组名取地址,&a,得到的是整个数组的首地址,是与数组首元素的地址是相等的,但是意义不同。

所以(a+1)是将地址值加4(一个int占4个字节大小),而&a+1是将地址值加20(数组大小为4字节*5个int类型的数字)。

 

注意:int *p=(int *)&a+1; 与 int *ptr=(int *)(&a+1);是不同的。

#include<stdio.h>
int main() {
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
    int *p=(int *)&a+1;
    printf("\n%d",*p);
    return 0;
}

 

posted on 2017-08-01 16:47  王小东大将军  阅读(280)  评论(0编辑  收藏  举报