在一切的開始,記憶體只是一片荒蕪,後修真者編譯天地,便有了今天的錦繡山河。
一塊沒有使用的記憶體就像是一片荒涼的大地,為了更方便管理,人們進行區域劃分,便有了良田千頃,房屋萬座,為了更方便的管理記憶體,幾乎在每一門程式語言中都有型別這個概念,每一種型別都有特定的大小,內存在被使用時就被不同的型別分割成了大大小小的不同的塊。c語言中基本資料型別有int、char等,在基本資料型別的基礎上又可以任意組合生成結構體型別。很多人在第一次接觸程式設計時,往往很難理解型別是乙個怎樣的概念,我個人覺得稱之為型別不是很合適,我更喜歡稱之為格式,本文會從格式的角度嘗試理解型別,看看會發生怎樣的結果。
在不同的平台上,同一種型別也會有不同的大小,所以拋開平台談型別無異於耍流氓,本文使用的環境為windows 64位。int格式占用空間為4個位元組,char格式占用空間為1個位元組,所以int格式和char格式不是同一種格式,float格式占用空間為4個位元組,那int格式和float格式就是同一種格式嗎?顯然這是不合邏輯的,格式的定義還是太過於模糊了,那就細分為儲存格式和讀取格式,儲存格式描述了資料儲存所占用的空間,讀取格式描述了儲存空間中的資料已何種方式組裝,這兩種格式決定了一種「型別「,int和float有用相同的儲存格式,但是沒有相同的讀取格式,所以它們不是一種格式。
當我們定義乙個變數的時候都發生了什麼呢?先看乙個很複雜的表示式:
int
之所以說這個表示式很複雜,是因為編譯器幫我們處理了太多的事,我們嘗試用格式的概念分析下這個表示式背後故事,語法分詞後編譯器首先接收到int關鍵字,int格式在編譯器中對應著類似這種結構:
定義乙個函式的時候,實際上是:
int
看到這你也許會發現,add和sub的返回格式和參數列相同,所以add和sub是同一種函式格式。可以嘗試定義乙個這種格式的函式指標:
// 定義func型別
從格式的概念看,函式和普通的變數沒有任何的區別,普通的變數可以進行型別轉換,那函式型別肯定也可以型別轉換:
int
可以看到,當函式指標強制轉換(回顧前文指標型別轉換一定不會發生資料丟失)時,參數列和返回值發生了變化,導致最終的結果不可預知,所以在日常開發中要盡量避免函式指標發生型別轉換。
文中定義了格式的概念只是為了幫助理解,真實的編譯過程並不是文中所述。
c語言 字串轉換為int或float
在c語言程式設計中,經常會遇到將字串或者字元陣列內的資料轉換為int型資料或者float型資料,網上找了好多方法,結果都不可行,可能是c 的函式吧。在經過多方詢問後,發現可以用atoi和atof函式來進行轉換,具體如下 它們都存在於中 atoi atoi 是把字串轉換成int型的乙個c語言函式,很方...
c語言 int型別轉換為string型別
include stdio.h int型別轉換為string型別 int i 要轉換的int型別 string s 轉換後的string型別 void int to str int int i,char string s else b for b 0 b 將得到的字串倒序 ptrfing 0 int...
把int轉換為char把int轉換為char
char ultoa unsigned long value,char string,int radix 將無符號整型數value轉換成字串並返回該字串,radix為轉換時所用基數 char ltoa long value,char string,int radix 將長整型數value轉換成字串並...