C 指標指向型別轉換,C 指標 型別轉換問題,

時間 2022-02-13 06:45:05

1樓:骨擺渡哥

long型別佔四個位元組,char佔一個,強制轉換後lp的每個元素就是對應從arr開始的四個位元組,即lp所指向的物件就是arr,arr+1,arr+2,arr+3這四個位元組所指向物件,低位元組在前,高位元組在後,下面是個例子: char arr[20]=「abcdefghijklmnopqrs」; long* lp=(long*) arr; cout<<*lp;

用反彙編得到arr和lp的地址為0x0012ff34,*lp=1684234849,轉換成16進位制是0x64636261,64對應d的ascii碼,其他類推。

2樓:匿名使用者

*lp的值應該會是 0x01010101. (假定平臺下long為32位的)

不過這樣的東西沒有意義,你這種的轉換其實是對機器位的重新解釋,它的形式依賴於特定的機器,該**不具有普遍性和移植性,建議慎用。

3樓:匿名使用者

*lp的值跟編譯器有關,如果long型佔4位元組 就是 00000001000000010000000100000001; 8位元組……

char在地址裡取出或者設定是1個位元組的數,long在地址裡取出或設定4個或多少個位元組的數,怎麼計算就按上面的方法來算

4樓:匿名使用者

gcc下實驗過為16843009,其十六進位制值為0x01010101,arr十六進位制的值為0x01;邏輯大概就是char型的指標會從指定位置讀取一個位元組作為值,long型會讀取4個位元組去解釋此值,因為計算機內部全是0,1,所以什麼樣的型別,決定了系統如何去解釋這個型別 ,而且還是機器有關的

5樓:匿名使用者

16843009

以 arr[0]開始 每四位元組看成是 一個 long 型資料

6樓:匿名使用者

強制型別轉換隻是轉換型別,如果資料位數沒有損失,則不會改變變數的值比如long轉short,double轉float,int等,資料長度變短,資料值就會改變

而對於指標而言,都是一個地址,對於同一個系統,指標的位數是一定的,因此這個強制轉換並不會改變變數的值

但是由於指向的資料型別變了,指向資料的長度可能也跟著變化這裡就有字元型轉為long型,在32位系統中,字元型佔用1個位元組,而long佔用4個位元組

因此*arr = 1

而*lp的值為16進位制0x01010101

7樓:匿名使用者

字元陣列arr[20],他的元素怎麼會等於1呢?

這個是強制轉換。

c++ 指標 型別轉換問題,

8樓:匿名使用者

沒有這麼化簡得吧。*(_8byte*)&f相當於*(unsigned long long*) &f

9樓:小白範

先看一個例子:

uint16 uidata = 0xffff;

uint16 *puidata = &uidata;

int16 *psidata = (int16*)puidata;

int16 sidata = *psidata;

那麼現在,sidata的值就是-1.

因為uidata那一段記憶體裡面儲存的內容的二進位制是1111 1111 1111 1111

puidata和psidata都指向那個位置,但是編譯器會根據它們的型別對這一段記憶體進行不同的解釋,如果是無符號型,那麼它就是65535(0xffff),如果是有符號型,那麼它就是-1.

第一個轉換是指標的強制型別轉換,它是告訴編譯器,這一塊記憶體不管以前是float型的資料,還是int型的資料,現在我告訴你,它是_8byte型的資料,你給我按照_8byte型的資料來解釋。根據ieee754中對浮點數的定義,1.5這個浮點數在記憶體中的二進位制表示是第一行的// 001111....

,然後把這一塊記憶體按照unsigned long long的型別來解釋,就變成了0x3fc00000。

第二種轉換,是資料型別之間的轉換,它是數值上的轉換,該轉換跟我們平常所理解的含義大致相同,比如把浮點數1.5轉換成無符號整數就變成了1(小數被截掉了)。再比如,把整數-1變成浮點數就是-1.0f。

10樓:匿名使用者

這可跟強轉型別不一樣,(long)int是把一個int裝成long,基本就是在前面加0這樣算,但是如果你用指標這樣做,可不是這樣的,首先float是4位元組的,但是你用了個8位元組指標去指向他的地址,然後又用*取值,那麼實際是你把f和後面4位元組的值都取出來了,前面4個位元組的float怎麼儲存你也不知道(這個你是可以知道的,關於float如何儲存在計算機中,有規律可循),後面4位元組是什麼也沒人知道(理論上是你接下來4個位元組的變數值,也可能其他情況,反正比較複雜),然後你用bitset<32>這種,就是把位給顯示了,後面的,你用的賦值,就是直接把1.5強轉成unsigned long long的,這個轉換就是取整數部分,用bitset<32>就是賦值,如果前面不夠就補0

關於c++指標強制型別轉換的問題 10

11樓:匿名使用者

既然書上是這麼說的話,那就是對的咯。

int a = 5;

cout << &a << endl;

printf("%x",&a);

其實你學習c++,c語言,你要知道的是,你定義的這個變數,它的地址是在**? 然後你用編譯器的除錯功能,找到這個地址,看看存放的是不是5這個數值。

int佔用4個位元組,那麼你應該在這個地址裡找到 00 00 00 05 這個內容,它佔用了4個位元組(比如是 00ff1301 - 00ff1304)這4個位元組。

你搞明白了地址,才會明白那些迴圈雖然繞,但是它繞不到**去。

你學習資料結構,連結串列什麼的,才會心中有數。

建議你去b站,搜尋「郝斌」,他講得不錯。

c++指標資料型別轉換問題

12樓:匿名使用者

char *buff;

......// 填充緩衝區buff

int a = *((int *)buff); // 讀出前4個位元組的int部分

double b = *((double *)(buff + 4)); // 讀出5--12位元組的double部分

13樓:王者不農藥

讀寫差不多,如果以位元組來計算,那麼可以這樣幹:

char* tempchar = ( char* )pbfile;

int a = 123456;//...

*((int*)( tempchar + 0 )) = a;

a = *((int*)( tempchar + 0 ));

double b = 465789;//...

*( (double* )(tempchar + 4 )) = b;

b = *( (double* )(tempchar + 4 ));

熟練了之後可以用更加簡單的方法。

14樓:匿名使用者

int *pi = (int*)&pbfile[0];

c++中指標型別強制轉換輸出的疑問:

15樓:君上沙夏

首先要知道指標有兩個屬性:指向變數/物件的  地址和長度

下面指定不同的型別輸出值是不一樣的但是起始地址都是一樣的

不知道你明白沒有,不懂可以追問

16樓:東風冷雪

我執行 都有錯誤

而且 ,你 *p3, *p4 是什麼鬼?

c++指標型別的強制轉換問題

17樓:東方千竹

第四行是把vp強制轉換成char*型別再對vp解引用,流插入運算子已經進行了過載;而不存在從char*轉換到int*的建構函式

18樓:匿名使用者

ip = (int *)vp;

關於c語言的指向指標的指標和指標

這個問題很好啊,其實如果你用printf列印p1和p的話,你會發現這兩個值是相等的,因為他們都是指標,c語言是不區分指標之間的差別的,一切指標都是指標,不管他指向什麼,但是當前面加上 號後,他們就有了區別,p1很顯然是一個char型別,而 p這是一個char 型別。printf會把p1指向地址中的值...

指標指向不同型別資料時,指標變數佔用多大空間

在c中,指標只有3種 指向簡單變數的,指向結構體變數的,指向函式的.他們的大小和指向的型別無關,基本都是一樣的,等於地址寬度.在16位的地址的系統裡,用 段 偏移 來表示一個地址,當只用偏移的時候 段內 稱為near指標,當段偏移都用的時候 跨段 稱為far指標,far指標佔用空間大於near指標....

能否建立void指標指向任何型別的變數

使用型別轉換的時,以void 為中介型別是個次等選項,能不用就別用。因為在強制型別轉換中,轉換到void 型別的結果會將帶型別的指標 typed pointer 的型別資訊悉數抹除,在典型的情況下,只要以void 為型別轉換的中介型別,則必須牢記這個指標的原始型別資訊,並 適時的在通過一次強制的型別...