一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

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ù)類型是ISO C99定義的,具體代碼在linux平臺(tái)的/usr/include/stdint.h頭文件中。

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

    /* 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ù)類型。
 

 

c++語(yǔ)言:

reinterpret_cast<type-id> (expression)

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

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

 

static_cast 與 reinterpret_cast

reinterpret_cast是為了映射到一個(gè)完全不同類型的意思,這個(gè)關(guān)鍵詞在我們需要把類型映射回原有類型時(shí)用到它。我們映射到的類型僅僅是為了故弄玄虛和其他目的,這是所有映射中最危險(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ì)算了父子類指針轉(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)題,如果用于子類和父類類型方面的轉(zhuǎn)換,會(huì)有問(wèn)題。如果需要在子類和父類指針之間的轉(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)買等信息,謹(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)論公約

    類似文章 更多

    自拍偷拍一区二区三区| 日韩一区二区三区18| 丝袜人妻夜夜爽一区二区三区| 国产一区二区久久综合| 人妻内射精品一区二区| 黑人巨大精品欧美一区二区区| 黄男女激情一区二区三区| 国产丝袜极品黑色高跟鞋| 最新日韩精品一推荐日韩精品| 亚洲第一香蕉视频在线| 久久三级国外久久久三级| 亚洲成人免费天堂诱惑| 久久黄片免费播放大全| 黄色国产一区二区三区| 国产午夜免费在线视频| 精品al亚洲麻豆一区| 91天堂素人精品系列全集| 亚洲另类女同一二三区| 亚洲高清一区二区高清| 色婷婷国产精品视频一区二区保健| 日韩色婷婷综合在线观看| 日韩欧美第一页在线观看| 国产熟女一区二区不卡| 欧美丰满人妻少妇精品| 国产欧美日韩综合精品二区| 欧美字幕一区二区三区| 高清欧美大片免费在线观看| 国产亚洲精品岁国产微拍精品| 欧美性猛交内射老熟妇| 久久99爱爱视频视频| 视频一区中文字幕日韩| 殴美女美女大码性淫生活在线播放| 91日韩欧美国产视频| 久久机热频这里只精品| 日韩欧美一区二区黄色| 在线免费观看黄色美女| 熟女免费视频一区二区| 人妻人妻人人妻人人澡| 国产性情片一区二区三区| 好吊妞在线免费观看视频| 日韩欧美一区二区久久婷婷|