簡體   English   中英

在c中發現指針的混亂

[英]Finding confusion in pointer in c

#include<stdio.h>

int main(){
    int a = 320;
    char *ptr;
    ptr =( char*)&a;
    printf("%d",*ptr);
    return 0;
}

我只是想知道有什么用(char*) 如果我使用(int*)而不是那個怎么辦?

你的變量是整數類型,即int a = 320; 你的指針是字符類型,即char *ptr;

字符指針只能指向字符類型變量,但是你的代碼中想要指向一個整數變量,那怎么可能呢? 通過這行代碼: ptr =( char*)&a; 它做的是通過使其成為字符類型,顯式地或強制地(無論你想要調用什么)類型轉換指針varble。

讓我們稍微改變一下程序:

int main() {
    int a = 0x12345678;   // put hexadecimal value 12345678 into a
    char *charptr = (char*)&a;
    int *intptr = &a;                
    printf("%x\n", *charptr);   // %x prints in hexadecimal
    printf("%x\n", *intptr);
    return 0;
}

在一個小端系統上,輸出將是:

78
12345678
  • &a是的存儲器地址a變量。
  • charptr是一個指向char的指針
  • intptr是一個指向int的指針

第二個輸出12345678很明顯,但第一個輸出78並不那么明顯。

在一個小端系統上,內存中的int a如下所示:

+----+
| 78 |  <---- both 'charptr' and 'intptr' point here
+----+
| 56 |
+----+
| 34 |
+----+
| 12 |
+----+

地址&a處的char(或字節)是0x78,因此如果取消引用charptr指針,則得到0x78

大端系統上,我們有:

+----+
| 12 |  <---- both 'charptr' and 'intptr' point here
+----+
| 34 |
+----+
| 56 |
+----+
| 78 |
+----+

第一個輸出是12而不是78


在這一行

char *charptr = (char*)&a;

(char*)被稱為強制轉換,它告訴編譯器將&a視為指向char的指針。

沒有演員:

char *charptr = &a;

你將得到一個編譯器警告,例如incompatible types - from 'int *' to 'char *' ,因為你試圖將指向int的指針指向一個指向char的指針。

如果你這樣寫:

char *charptr = (int*)&a;

那么你也會得到一個編譯器警告incompatible types - from 'int *' to 'char *' 反正在這種情況下, (int*)投是無用的,因為&a已經一個指針int

調用變量ptr不會使它成為指針。 如果你想讓它成為一個指針,它必須用* ie int *ptr; char *ptr;

將類型為&a的指針轉換為char類型只是愚蠢的,因為它們是完全不同的東西。 使用(int *)不會改變&a的類型,所以你不需要把它放進去,但是你的編譯器會告訴你ptr完全是用於存儲&a的值的錯誤類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM