數組
數組的意義與性質
-
數組的定義
定義格式:元素類型 數組名稱[常數表達式]
示例:int a[8]; // 定義包含8個整數元素的數組
-
特别說明
常數表達式必須是常數和常量,不允許為變量
錯誤示例:int count = 8; int c[count];
數組元素編号從0開始計數,元素通路格式為a[0]、a[1]、…
不允許對數組進行整體指派操作,隻能使用循環逐一複制元素
錯誤示例三:int a[8], b[8]; a=b;
-
意義與性質
将相同性質的資料元素組織成整體,構成單一次元上的資料序列
數組的位址
數組的基位址:數組開始存儲的實體位置
數組首元素的基位址:數組首個元素開始存儲的實體位址,數值上總是與數組基位址相同
“&”操作符:&a獲得數組的基位址;&a[0]獲得數組首元素的基位址
設數組基位址為p,并設每個元素的存儲空間為m,則第i個元素的基位址為p+mi
數組元素的初始化
-
基本初始化格式
定義格式:元素類型 數組名稱[元素個數] = {值1,值2,值3,…};
示例:int a[8] = {1, 2, 3, 4, 5, 6,7,8};
int a[8] = {,6,7,8};
-
初始化時省略元素個數表達式
在全部元素均初始化時可以不寫元素個數,使用sizeof操作符可以獲得元素個數
示例二:int a[] = {1, 2, 3, 4, 5,6,7,8};
int num_of_elements = sizeof(a)/sizeof(a[0]);
sizeof(a)擷取資料存儲空間大小(以位元組為機關),sizeof(a[0])擷取數組首元素的存儲空間大小
數組與函數
-
數組元素作為函數實際參數
int Add(int x, int y){return (x+y);}
int a[2]={1,2}, sum;
sum = Add(a[0], a[1]);
-
數組整體作為函數形式參數
基本格式:傳回值類型 函數名稱(元素類型 數組名稱[], 元素個數類型 元素個數)
示例:void GenerateIntegers(int a[], unsigned int n);
特别聲明:作為函數形式參數時,數組名稱後的中括号内不需要寫元素個數,必須使用單獨的參數傳遞元素個數資訊。a[]數組既是輸入的一部分也是輸出的一部分(簡單了解為按位址傳遞)。
多元數組
-
多元數組的定義
定義格式:元素類型 數組名稱[常數表達式1][常數表達式2]…
示例一:int a[2][2]; //2x2個整數元素的二維數組
示例二:int b[2][3][4]; //2x3x4個整數元素數組
特别說明:同單維數組
-
多元數組的初始化
與一維數組類似:int a[2][3] = {1, 2, 3, 4, 5, 6}
單獨初始化每一維:int a[2][3] = {{1, 2, 3}, {4, 5, 6}}
結構體
-
結構體的意義與性質
與數組的最大差别:不同類型資料對象構成的集合,當然也可以為相同類型的但具體意義或解釋不同的資料對象集合
-
結構體類型的定義:注意類型定義後面的分号
struct 結構體名稱
{
成員類型1 成員名稱1;
成員類型2 成員名稱2;
…
成員類型n 成員名稱n;
};
-
結構體類型示例
示例一:日期結構體
struct DATE { int year; int month; int day; };
-
結構體類型的聲明
僅僅引入結構體類型的名稱,而沒有給出具體定義,其具體定義在其他頭檔案中或本檔案後續位置
struct COMPLEX;
- 結構體資料對象的通路
-
結構體類型的變量與常量:按普量通格式定義
示例一:DATE date;
示例二:STUDENT zhang_san;
示例三:STUDENT students[8];
-
結構體量的初始化
示例四:DATE date={2008, 8, 8};
-
結構體量的指派
與數組不同,結構體量可直接複制,拷貝過程為逐成員一一複制
示例五:DATE new_date; new_date=date;
-
結構體量成員的通路
使用點号操作符"."解析結構體量的某個特定成員
示例一:DATE date;date.year=2008;date.month=8;date.day=9;
-
嵌套結構體成員的通路
可以連續使用點号逐層解析
示例二:
struct FRIEND { int id; STRING name; DATE birthday; }; FRIEND friend; friend.birthday.year = 1988;
-
複雜結構體成員的通路
嚴格按照文法規則進行
示例三:
FRIEND friends[4]; friends[0].birthday.year=1988;
-
結構體與函數
編寫一函數,使用結構體類型存儲日期,并傳回該日在該年的第幾天資訊,具體天數從1開始,例如2016年1月20日傳回20,2月1日傳回32
unsigned int GetDateCount(Date date) { static unsigned int days_of_months[13]= {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; unsigned int i, date_id = 0; for(i=1, i<date.month;i++) { date_id += days_of_months[i]; } date_id += date.day; if(date.month > 2 && IsLeap(date.year)) date_id++; return date_id; }