C語言學習之 數組,指針,字符串. (二)

前篇內容介紹了簡單的 數組與指針 的簡單形式. 都是簡單的 *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 是字符串長度下標. 聲明的時候能夠直接聲明成一個字符指針就可使用了.  留給下一篇再講.

相關文章
相關標籤/搜索