程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> (地基工)為什麼整數可以轉換為指針

(地基工)為什麼整數可以轉換為指針

編輯:C++入門知識

摘要:在C/C++學習過程中,尤其是C學習到中階之後,可能會由遇到把指針轉換為整數或把整數轉換指針的過程,第一次接觸的人可能會有疑問,本文的目的就是解決這個疑問。 問題 在C/C++代碼遇到下面這些表達式: //把一個整數賦值給一個指針 char* p_0=0; int* p_1=(int*)569;   //把一個指針賦值給整數 unsigned int n_0=(unsigned int)p_1; unsigned int n_1=(unsigned int)p_0; 我們的問題是,為什麼這些是正確的,甚至有時不很常見的。 答案 要回答這個問題,我們需要回到二進制以及位模式的解釋,或者內存地址定位方法上。我們先從內存地址定位方法上開始。 現在的系統是很復雜的軟件系統和硬件系統的組合,我們的應用程序運行在操作系統之上,操作系統為應該程序提供了一層透明的內存訪問和使用機制:內存就是一個很大的字節數組,它通過數組的下標索引來定位。這裡所講的機制,實際上就是虛擬內存技術,廣泛地存在於現在的操作系統之中。 明白內存就是一個大數組之後,那麼就不難理解指針與整數的互換了,因為一個指針變量的值就是一個地址,那麼這個地址實際上就是內存那個大數組的下標,下標是什麼?下標就是整數,如此指針與整數之間的轉換是正常的,並且在更底層的代碼中,我們會見到指針與整數就是一個東西,但在C/C++這樣認為就不合適了。 讓我們來考慮二進制,這裡說到一些比較接近機器的概念,不明白可以跳過。二進制就是0或1的串,好比“001101”這樣的。一個整數可能由一個“01101”組成,這裡它是25;那麼一個指針也可能由一個“01101”組成,此時它代表什麼呢?此時它代表內存中被編號為25的那個字節。這樣的看到了,同樣一個二進制串被用於表達不同的意義,這就是計算的偉大之處,它把相同的位模式放於不同的環境之中,對其進行不同解釋,從而產生千差萬別的意義。有一句話是這樣說的:信息=位+上下文,想要表達的意思就是這個。 總結一下,整數與指針可以相互轉換的原因是:內存是一個大數組,此外更深刻的原因是,對於人來說一個整數,一個是指針,但對於機器來說,它們都是二進制位。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved