欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于强制类型转换

程序员文章站 2022-07-15 16:37:11
...

思考

#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;
}

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