簡體   English   中英

為什么我們需要不同的指針數據類型?

[英]Why do we need different datatype for pointer?

  1. 基本上,指針是一個用於存儲內存地址的變量,它始終是
    十六進制(內存地址)那么為什么我們需要不同的數據類型來存儲地址。
  2. EX:int * a; 我們可以使用它來存儲浮動地址。

並非所有指針都是(必須具有)相同的大小。 如果你有一個需要對齊到10 MB的大型結構,編譯器可以決定它只需要8位(而不是通常的32位或64位)來存儲你的變量所在的所有可能的地址。

你也不需要不同的數據類型,你可以使用void*就好了,但為什么會這樣呢? 在C ++中,這是一種代碼嗅覺。

還有類型安全。 你知道一個int*指向一個int ,這對你有利。

兩個原因:

  1. 在某些體系結構上,指針可能具有不同的格式,具體取決於它們指向的數據大小。 例如,指向char的指針必須能夠處理單個字節,但是指向int的指針只需要能夠處理4個字節的組。 所以后者可以使用包含字節地址除以4的格式。

  2. 它允許編譯器生成正確的程序。 如果您嘗試取消引用char指針並將其指定給int ,則需要知道它應該只讀取源中的一個字節,並將其擴展為int的大小。 如果沒有指針類型聲明,它將讀取比適當更多的字節。

對於初學者,我不知道指針存儲為十六進制的機器; 我熟悉的每台機器都在內部使用二進制表示。 (至少在過去30年或40年.IIRC,IBM 1401到處使用小數。)

正如其他人所指出的,並非所有指針具有相同的大小和表示。 我曾經在char*比其他數據指針類型更大的機器上工作,當然,函數指針和數據指針的大小不同,曾經很常見。

然而,真正的答案是它基於C和C ++中的類型系統。 如果p是指針,那么*p的類型是什么? 如果我寫了類似*p + *q東西,編譯器必須知道是否使用整數運算或浮點運算。

至於你的第二個問題:通常,是的,雖然你可能需要在某處進行reinterpret_cast 但是,你可以合法地使用你的int*將它轉換回float* ; 解除引用它是未定義的行為。

char*unsigned char*有一些例外。 在實踐中,如果你知道自己在做什么,就可以逃避:

float f;
int* a = reinterpret_cast<int*>( &f );
std::cout << *a << std::endl;

我實際上做了類似的事情,用於某種低級調試或編程; 比如從float提取指數字段。 但是,這樣的代碼非常罕見,並且正式涉及未定義的行為,因此您必須驗證編譯器實際執行的操作,並可能關閉某些優化。

因為它提供了有關如何解釋指針指向的數據的信息。

EX:int * a; 我們可以使用它來存儲浮動地址。

通過C類型的不安全功能:是的,但不是直接的,特別是在最近的編譯器和標准中(往往更安全,更安全)

為什么我們需要不同的數據類型來存儲地址

這實際上是正確的問題,答案隱藏在其中 - 為什么我們需要一個不同的數據類型來存儲地址。 我們(程序員)需要它。 機器不關心 - 一個數字就像另一個數字。

如果您將“變量”視為某些數據的“占位符”,則在使用數據本身和使用變量之間的編程語言中存在二分法。 有時您只需要數據(例如,您需要將其打印出來),有時您需要存儲此數據的地址(例如,您可以對其進行修改)。 大多數語言都有語法糖,這會混淆這兩種情況,並在不同的上下文中區別對待變量標識符。

一個這樣的情況是這樣的:考慮聲明

a = 1;

在這種情況下,編譯器查找由“a”標識的變量的地址,並將“1”寫入該地址。 標識符“a”也可以是指針。 現在看一下另一件事:

if (a == 1) ... ;

沒有將“a”標識的變量的地址與某些內容進行比較,而是將此地址中存儲的內容與“1”進行比較。

為了方便程序員,各種“指針類型”再次存在:基本上我們通過錯誤地訪問數據來減少錯誤。 看看這個例子:

double d;
double* dp;
int i;
int* ip;

默認情況下,C對此非常放松,通常可以執行以下操作:

dp = ip;

要么

dp = &i;

......但是! sizeof(i)== 4和sizeof(d)== 8,所以如果你取消引用dp指針你會嘗試從只保留4的變量(i)中讀取8個字節。這意味着你將讀取4個不可預測的在i的前四個字節之后的(隨機)字節,這絕對是你不想做的事情。

同樣,所有這些都是為了我們的方便。 機器不在乎。 兩個指針的外觀和行為與CPU完全相同。

暫無
暫無

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

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