1. 程式人生 > >關於強制型別轉換

關於強制型別轉換

思考

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

大家能想到這樣結果是多少麼