关于指针和数组的移动

#include<stdio.h>  

int main()  
{  
    int  a[5] = { 1, 2, 3, 4, 5 };  
    int *ptr = (int * )(&a + 1);  
    printf("%d %d\n", *(a + 1), *(ptr - 1));  
    return 0;  
}

程序运行的结果是:2,5.

2这个结果没什么异议*(ptr-1)为什么5呢? 因为是&a+1移动的是一整个数组的长度(&a是整个数组的长度5*int),之后强制类型转换(int*),ptr-1移动之后的字组长度的首地址再向后移动一个int, 到了前面数组的最后一个字节地址了, 所以是5.

经测试把a[5]改成a[6], 加一个元素6 , 输出也是6.

#include<stdio.h>  

int main()  
{  
    int  a[6] = { 1, 2, 3, 4, 5, 6 };  
    int *ptr = (int*)(&a + 1);  
    printf("%d %d\n", *(a + 1), *(ptr - 1));  
    return 0;  
}

&a 改成&a[0] ,移动的就是一个int了,结果为2,1, 如下:

#include<stdio.h>  

int main()  
{  
    int  a[5] = { 1, 2, 3, 4, 5 };  

    int *ptr = (int*)(&a[0] + 1);   //这样改后  "int *" 可以不要了.  

    printf("%d %d\n", *(a + 1), *(ptr - 1));  
    return 0;  
}

posted @ 2020-10-16 21:09  double64  阅读(196)  评论(0)    收藏  举报