天天看點

iOS開發系列--C語言之數組和字元串概覽一維數組擴充--數組的存儲多元數組字元串

數組在c語言中有着特殊的地位,它有很多特性,例如它的存儲是連續的,數組的名稱就是數組的位址等。而在c語言中是沒有string類型的,那麼如果要表示一個字元串,就必須使用字元數組。今天主要就介紹如下三個方面:

<a href="http://www.cnblogs.com/kenshincui/p/3843505.html#onedimensionalarray">一維數組</a>

<a href="http://www.cnblogs.com/kenshincui/p/3843505.html#moredimensionalarray">多元數組</a>

<a href="http://www.cnblogs.com/kenshincui/p/3843505.html#string">字元串</a>

一維數組操作比較簡單,但是需要注意,數組長度必須是固定的,長度不能使用變量進行初始化;如果聲明的同時進行指派則數組長度可以省略,編譯器會自動計算數組長度;同時數組不能先聲明再一次性指派(當然可以對每個元素一一指派)。

數組在記憶體中存儲在一塊連續的空間中,如果知道數組類型(int、float等)和初始位址就可以知道其他元素的位址,同時由于數組名等于數組第一個元素的位址,是以當數組作為參數(作為參數時形參可以省略)其實是引用傳遞。

我們看一下上面定義的數組在記憶體中存儲結構

iOS開發系列--C語言之數組和字元串概覽一維數組擴充--數組的存儲多元數組字元串

再來看一下數組作為參數傳遞的情況,數組作為參數傳遞的是數組的位址

多元數組其實可以看成是一個特殊的一維數組,隻是每個元素又是一個一維數組,下面簡單看一下多元數組的初始化和指派

以上面a數組為例,它在記憶體中的結構如下圖

iOS開發系列--C語言之數組和字元串概覽一維數組擴充--數組的存儲多元數組字元串

根據上圖和一維數組的存儲,對于二維數組可以得出如下結論:數組名就是整個二維數組的位址,也等于第一行數組名的位址,還等于第一個元素的位址;第二行數組名等于第二行第一個元素的位址。用表達式表示:

a=a[0]=&amp;a[0][0]

a[1]=&amp;a[1][0]

同樣可以得出a[i][j]=a[i]+j。關于三維數組、四維數組等多元數組,其實可以以此類推,在此不再贅述。

在c語言中是沒有字元串類型的,如果要表示字元串需要使用char類型的數組,因為字元串本身就是多個字元的組合。但是需要注意的是字元串是一個特殊的數組,在它的結束位置必須要加一個”\0”(ascii中0是空操作符,表示什麼也不做)來表示字元串結束,否則編譯器是不知道什麼時候字元串已經結束的。當直接使用字元串指派的時候程式會自動加上”\0”作為結束符。

從上面代碼注釋中可以看到列印b的時候不是直接列印出來“iam”而是列印出了“iamkenshin”,原因就是編譯器無法判斷字元串是否結束,要解釋為什麼列印出“iamkenshin”我們需要了解a和b在記憶體中的存儲。

iOS開發系列--C語言之數組和字元串概覽一維數組擴充--數組的存儲多元數組字元串

從圖中我們不難發現由于a占用8個位元組,而定義完a後直接定義了b,此時配置設定的空間連續,b占用3個位元組,這樣當輸出b的時候由于輸出完“iam”之後并未遇到”\0”标記,程式繼續輸出直到遇到數組a中的“\0”才結束,是以輸出内容為“iamkenshin”。

下面簡單看一下和字元和字元串相關的常用的幾個函數

注意: 1.在xcode中會提示gets是不安全的,推薦使用fgets()。 2.strlen()隻用于計算字元串長度,由于在c語言中字元串使用字元數組長度表示,是以它可以計算帶有’\0’結尾的字元數組長度,但是它并不能計算其他類型的數組長度。

繼續閱讀