关于强制类型转换

思考

#include<stdio.h>

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

    int *ptr1=(int *)(&a+1);

    int *ptr2=(int *)((int)a+1);

    printf("%x, %x\n", ptr1[-1], *ptr2);


    return 0;
}

输出:4,2000000

我们先看第一个我们知道ptr1[n] = *(ptr1 + n)所以ptr1[-1]实际上就说ptr所指的前一个元素,除此之外我们还要注意int *ptr1=(int *)(&a+1);中的&a是取a的引用,他的值和a相同(本人亲测),但是引用相当于取整体,所以+1相当于+4,所以指针ptr所指的前一个元素为4.

第二个

将a转为int类型(同char *)注:除了指针类型只能用转int,因为指针固定的,必须转int(4字节),强制类型转换不能对内存地址操作,所以只可以用int,这样表示让地址按整形去计算。

联想

#include<stdio.h>

int main()
{
    char a[5] = {1, 1, 1, 1,0};

    int *ptr1=(int *)(&a+1);

    int *ptr2=(int *)((int)a+1);

    printf("%x, %x\n", ptr1[-1], *ptr2);

    return 0;
}

大家能想到这样结果是多少么

猜你喜欢

转载自blog.csdn.net/qq_41282102/article/details/82770852