前篇內容介紹了簡單的 數組與指針 的簡單形式. 都是簡單的 *p 或者 a[5] 這樣的簡單形式. 順便引出了 typedef .
內容至關簡單沒有深度. 概念也至關簡單. 一切皆爲數字, 計算機操做的都是數字. 數組
若是上篇沒有疑問,下面這段不用再讀, 直接跳到 typedef的應用. 指針
回顧一下概念. 變量是什麼. 只是一種表示形式而已, 用以表示恰當的存儲空間大小的形式.
類型, 只是一種概念,也用來表示空間的大小. 與變量的關係. 變量是表示形式, 類型是空間的大小.
變量都有類型, 指針又是什麼. 指針也是一種變量,也有存儲空間, 空間的大小就是指針類型所佔用的大小. 指針名就是用來表示用以存儲"空間地址"的存儲空間. 全部指針佔用的空間在同一平臺下是相等的. 能夠用 sizeof(void *) 來獲取.
基本的類型有 char, 佔用8位, 1字節. short , 佔用16位, 2字節, sizeof(char) =1, sizeof(short) =2 . 還有其餘一些類型. code
typedef 能夠用來定義一些類型. 最簡單的形式就是給一些基本類型起一些其餘的名字. 好比 typedef int abc; 以後, abc 類型和int 類型就是同樣的. 字符串
數組是一段連續存儲空間的表示形式. 好比 char a[5]; 這條語句是一個聲明. 表示 5 個sizeof(char) 的連續存儲空間. 數組名是 a , 其實, a 也是一個數字, 這個數字就是 所表示的5個空間的首地址. 佔用空間大小計算方式爲 5*(sizeof(char)); 同理 short b[5]; 中的 b也是一個數字, 對應的是 5個連續 short 的空間首地址. short b[5]佔用的存儲空間大小爲 5*(sizeof(short)); io
指針 也是佔用存儲空間的, 佔用大小也是固定的. 指針也是一個數字. 存儲的是一個 存儲空間地址. class
typedef的應用 變量
這些在上篇都講過,這裏又囉嗦了一遍. 上篇還講了一個小魔法. 指針與數組. 下面給出的仍是上篇中的例子,咱們作些小修改. gc
#include <stdio.h> typedef char ta[5]; int main(int argc, char *argv[]) { ta a[3]; /*聲明數組*/ int i,j; for(i = 0; i < 3; i++) { for (j=0; j < 5;j++ ) { a[i][j] = i*10+j; } } ta *pa; pa=&a[0]; /*這樣好理解. 指向數組首地址*/ printf("%d\n", *pa); printf("%d\n", a); printf("%d\n", pa[1][3]); printf("%d\n", *(pa[1]+3)); printf("%d\n", *(*(pa+1)+3)); printf("%d\n", a[0][0]); printf("%d\n", *(*(pa+0)+0)); printf("%d\n", **pa); a[0][0] = 99; printf("%d\n", **pa); }
其中 a 是一個數組, 表示一段連續存儲空間. a也是一個數字, 計算機中一切都是數字, a也表示連續存儲空間的首地址.
接下來看看 a 這個數組的訪問. a 有3個元素, 分別是 a[0] a[1] a[2]. 計算機中,一切都是數字. a 又是 元素的首, 還有其餘訪問呢形式可用.
a[0] 可表示爲 *(a+0) . 意思是, 取 a+0 這個地址對應的內容. 因爲 a+0 等於a , 可簡單寫成 a, 因此 *(a+0) 可簡單寫成*a;
a[1] 又可表示 *(a+1). 同理 a[2] 能夠用 *(a+2) .
這裏須要記住的一點, 一切都是數字, 數組表示形式,只是爲了讓咱們好用,好理解, 任何數組均可以用指針的表示形式來表示. 二維數組
請留意 最後兩條語句. 看結果是否是跟想象中的同樣. 在這裏出現了 **pa ; 試着理解它. 再試着理解*(*pa+1) 和 (*pa)[1] 的關係. 他們是同樣的. 用指針表示形式都是同樣的.
這裏需呀記住的只有一點. 透過表象看本質. 多維數組, 沒那麼神祕, 數組是用來表示一段連續的存儲空間. 多維數組是對多個一維數組的抽象. 最終的本質都是經過指針來訪問目標的. 在這裏只須要注意的是, 每一個目標究竟表示的是什麼.
好比 a[1] , 表示的是 是個 ta 類型的內容. ta 類型又表示爲一個長度爲5的char 數組. 若是將 char 換成 short 類型,結果不會有任何改變. **pa 就是用來表示 *(*pa+0), *pa 的類型是ta, ta又是一個數組, 因此又能夠表示爲 (*pa)[0],又能夠表示爲(*(pa+0))[0],或者(pa[0])[0]; 也就是pa[0][0];
二維數組就是這麼回事. 用一樣的思路去理解3維數組就能夠了. 數組,也沒什麼大不了. 計算機
char x[3][5] ,這個聲明應該怎麼去理解呢? 能夠假想成 , 有一個類型, 他的樣子相似於 char y[5];
char x[3][5]; 就是有3個像 char y[5] 這樣的東西存在. 固然, 的確沒有 char y[5]這樣的東西. 由於 沒有 char y[5] 這樣的類型.
因此 char x[3][5] 應該理解成 x[3*5] 也就是 char x[15];
能夠將 全部的 char 類型 改變成 short 類型加深理解.
數組能夠轉換爲指針, 指針的形式表示. 反之卻不必定成立.
數組與指針就這點關係. 認清本質 會 發現, 也不過如此. 下面將是 字符串與數組的關係.很簡單. C語言裏沒有字符串這個類型, 字符串用 字符數組的概念表示. 不一樣的是,每一個字符串後面都有 '\0' 結束. 字符串的本質就是一個字符數組. 然而,咱們運用字符串的時候.更多操做的都是指針. 一個指向字符數組的指針. char (*a)[n]; 相似於這樣的指針. 固然, char (*a) [n] 中的 n 是字符串長度下標. 聲明的時候能夠直接聲明成一個字符指針就可使用了. 留給下一篇再講.