午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

c、c++指針和整型的互相轉(zhuǎn)換...

 wuxinit_ 2021-04-15

c語(yǔ)言:

Noncompliant Code Example(不兼容的代碼示例)

The size of a pointer can be greater than the size of an integer, such as in an implementation where pointers are 64 bits and unsigned integers are 32 bits. This code example is noncompliant on such implementations because the result of converting the 64-bit ptr cannot be represented in the 32-bit integer type:

void f(void) {

char *ptr;

/* ... */

unsigned int number = (unsigned int)ptr;

/* ... */

}

Compliant Solution(兼容的代碼示例)

Any valid pointer to void can be converted to intptr_t or uintptr_t and back with no change in value (seeINT36-EX2). The C Standard guarantees that a pointer to void may be converted to or from a pointer to any object type and back again and that the result must compare equal to the original pointer. Consequently, converting directly from a char * pointer to a uintptr_t, as in this compliant solution, is allowed on implementations that support the uintptr_t type.

#include

void f(void) {

char *ptr;

/* ... */

uintptr_t number = (uintptr_t)ptr;

/* ... */

}

使用intptr_t和uintptr_t才是兼容的,就死一套代碼同時(shí)兼容32位和64位的操作系統(tǒng)。

 

intptr_t和uintptr_t

這兩個(gè)數(shù)據(jù)類(lèi)型是ISO C99定義的,具體代碼在linux平臺(tái)的/usr/include/stdint.h頭文件中。

該頭文件中定義intptr_t和uintptr_t這兩個(gè)數(shù)據(jù)類(lèi)型的代碼片段如下:

    /* Types for `void *' pointers.  */
    #if __WORDSIZE == 64
    # ifndef __intptr_t_defined
    typedef long int        intptr_t;
    #  define __intptr_t_defined
    # endif
    typedef unsigned long int    uintptr_t;
    #else
    # ifndef __intptr_t_defined
    typedef int            intptr_t;
    #  define __intptr_t_defined
    # endif
    typedef unsigned int        uintptr_t;
    #endif

在64位的機(jī)器上,intptr_t和uintptr_t分別是long int、unsigned long int的別名;在32位的機(jī)器上,intptr_t和uintptr_t分別是int、unsigned int的別名。

那么為什么要用typedef定義新的別名呢?我想主要是為了提高程序的可移植性(在32位和64位的機(jī)器上)。很明顯,上述代碼會(huì)根據(jù)宿主機(jī)器的位數(shù)為intptr_t和uintptr_t適配相應(yīng)的數(shù)據(jù)類(lèi)型。
 

 

c++語(yǔ)言:

reinterpret_cast<type-id> (expression)

type-id 必須是一個(gè)指針、引用、算術(shù)類(lèi)型、函數(shù)指針或者成員指針。它可以把一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù),也可以把一個(gè)整數(shù)轉(zhuǎn)換成一個(gè)指針先把一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù),再把該整數(shù)轉(zhuǎn)換成原類(lèi)型的指針,還可以得到原先的指針值)。

type-id是轉(zhuǎn)換后的類(lèi)型,expresion是轉(zhuǎn)換前的。

 

static_cast 與 reinterpret_cast

reinterpret_cast是為了映射到一個(gè)完全不同類(lèi)型的意思,這個(gè)關(guān)鍵詞在我們需要把類(lèi)型映射回原有類(lèi)型時(shí)用到它。我們映射到的類(lèi)型僅僅是為了故弄玄虛和其他目的,這是所有映射中最危險(xiǎn)的。(這句話是C++編程思想中的原話)

static_cast和reinterpret_cast的區(qū)別主要在于多重繼承,比如

1

2

3

4

5

6

7

8

9

10

11

class A {

    public:

    int m_a;

};

 

class B {

    public:

    int m_b;

};

 

class C : public A, public B {};

那么對(duì)于以下代碼:

1

2

C c;

printf("%p, %p, %p", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c));

前兩個(gè)的輸出值是相同的,最后一個(gè)則會(huì)在原基礎(chǔ)上偏移4個(gè)字節(jié),這是因?yàn)?a >static_cast計(jì)算了父子類(lèi)指針轉(zhuǎn)換的偏移量,并將之轉(zhuǎn)換到正確的地址(c里面有m_a,m_b,轉(zhuǎn)換為B*指針后指到m_b處),而reinterpret_cast卻不會(huì)做這一層轉(zhuǎn)換。

總結(jié):reinterpret_cast用于指針和整型之間的轉(zhuǎn)換是沒(méi)有問(wèn)題,如果用于子類(lèi)和父類(lèi)類(lèi)型方面的轉(zhuǎn)換,會(huì)有問(wèn)題。如果需要在子類(lèi)和父類(lèi)指針之間的轉(zhuǎn)換,要用static_cast。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多