曾聽好多朋友說,C是一種懷舊的語言,因為它的歷史很久遠,然而自從各種面向對象的編程語言的相續出現讓它的影響力日減。
當然了,這是無可非議的,但是C的高效性是其他語言無妨比擬的,所以我們有必要把握其中的精華與奧妙,也就有必要知道其中的基本的數據結構的比如數組,稍微有點深度的堆棧、列表、結構體等的操作和實現。指針也是C語言中的一個很優秀靈活的結構,對它的了解也是必不可少的。
我們一般都認為數組是一維的數據存儲結構,因為二位數組或者說矩陣都可以看作是多個一維數組的組合結構,定義在其上的數據存儲訪問方式是一樣的。所以一維數組是其中最基礎的最重要的部分,只有理解了此類數據結構的本質才能觸類旁通了。
數組(array)是若干同類變量的聚合,允許通過統一的名字飲用其中的變量。所以數組也就是一個同一類型的數據的有限集合??梢酝ㄟ^下表來訪問數組中的某一/些數組元素。
在C語言中數組都由連續的內存區域構成(有時候,不一定是這樣),最低地址對應首元素,數組的下標是從0開始的,所以首元素也就是數組下標為0的元素,最高的地址對應最末的元素,即第N-1個元素(如果我們定義的數組為N元)。
數組的定義方式:
在C語言中允許在聲明數組的時候同時對其進行初始化,也可以把聲明和定義放在不同的位置,初始化的一般的類似于如下的表達式:
type_specifier array_name[size1]...[sizeN] = {value_list};
其中vlaue_list是由逗號(,)分隔的常量表,常量表必須和type_specifier兼容。最后由分號與下一個語句分隔。由此可見一維數組的定義方式為:
type_specifier
array_name[size] = {value_list};
如下:
char hello[12] = {’H’,’e’,’l’,’l’,’o’,’,’
,’ ’,’w’,’o’,’r’,’l’,’d’,’\0’};
注意:字符數組是一"’\0’"收尾的,這是C標準的一部分。因為在操作字符數組的時候是以’\0’作為結束判斷的標志。當然了,如果你定義的是一個字符串那就不用加這個’\0’了。因為有機制幫助你自動添加。
上面的例子的串的生命方式為:string hello = "Hello, world";(當然了,具體的實現中你必須把"string.h"頭文件加入到你的文件中),或者你也可以這樣來聲明:
char *hello = "Hello, world";或者char hello[] = "Hello, world";
切換為字符指針數組,其效果是一樣的);數組初始化的時候還可 以不標明最大小,即
char hello[] = {’H’,’e’,’l’,’l’,’o’
,’,’,’ ’,’w’,’o’,’r’,’l’,’d’,’
\0’};,
這時候編譯器會根據后邊的賦值情況為數組分配合適的內存空間,這個你不用擔憂,除非機器正處于內存缺狀態。
數組元素的訪問:
可以利用循環結構來挨個訪問數組的元素,比如:
[...]
int i;
char hello[12] = {’H’,’e’,’l’,’l’,’o’,’
,’,’ ’,’w’,’o’,’r’,’l’,’d’,’\0’};
[...]
for(i = 0; i < 12; i++){
printf("%c",hello[i]);
}
printf("\n");
[...]
其中有一點必須注意了,那就是i的值不能取到12,因為我們的下標識從0開始的,即hello[0]是第一個元素,數組的下界,而hello[12]是第一個空元素,數組的上界。
其實,數組元素的個數等于定義時的下標,也等于數組的上界(12)減去下界(0)得到的數值,還等于上界地址減去下界地址模sizeof(tyep_specifier)的值(假設數組空間是連續分布的,如果不是這樣那么這種方法也就不成立了)。
原文轉自:http://www.anti-gravitydesign.com