數組、結構體都是自建的數據結構,兩者是類似的,都表示一組數據的集合,但也有區別,其區別是:數組
一、 數組內部數據類型相同,結構體內部數據能夠不一樣;數據結構
二、數組按下標訪問,結構體由於數據類型不一樣,所以數據存儲大小不一樣,因此不能按照下標訪問,只能使用運算符+元素名來訪問;函數
數組:指針
屬於構造數據類型。一個數組能夠分解爲多個數組元素,這些數組元素能夠是基本數據類型或是構造類型。所以按數組元素的類型不一樣,編譯
數組又可分爲數值數組、字符數組、指針數組、結構數組等各類類別。變量
一、數值數組循環
如:int a[10]; 說明整型數組a,有10個元素。
float b[10],c[20]; 說明實型數組b,有10個元素,實型數組c,有20個元素。硬件
數組的通常形式爲: 類型說明符 數組名 [常量表達式],……; 數據類型
其中,類型說明符是任一種基本數據類型或構造數據類型。 數組名是用戶定義的數組標識符。 float
方括號中的常量表達式表示數據元素的個數,也稱爲數組的長度。C語言中不容許未知長度的數組定義,
在程序編譯時,數組的長度是計算好的,即不容許定義 int a[n];類型的數組。
數組元素的表示方法爲數組名+下標變量,如 a[5], a[i + j], a[i++]等。
C語言對數組的初始賦值還有如下幾點規定:
1.能夠只給部分元素賦初值。當{ }中值的個數少於元素個數時,只給前面部分元素賦值。例如: static
int a[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,然後5個元素自動賦0值。
2.只能給元素逐個賦值,不能給數組總體賦值。 例如給十個元素所有賦1值,只能寫爲: static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能寫爲: static int a[10]=1;
3.如不給可初始化的數組賦初值,則所有元素均爲0值。
4.如給所有元素賦值,則在數組說明中, 能夠不給出數組元素的個數。例如:
static int a[5]={1,2,3,4,5};可寫爲: static int
a[]={1,2,3,4,5};動態賦值能夠在程序執行過程當中,對數組做動態賦值。 這時可用循環語句配合scanf函數逐個對數組元素賦值。
二、字符數組
exmple:
char str[] = "hello world";
數組首地址即爲數組指針,在對str求長度時,strlen()求的結果爲11,sizeof()結果爲12;
由於在字符數組後默認添加字符 '\0'表示數組結束標誌。
三、二維數組
example:
int a[2][3]; 表示2行3列六個數值;
在按行排列的硬件中,二維數組先知足列元素分配,不足補0;
如數組a[2][3] = {1, 2, 3, 4, 5, 6, 7};
其表示a[2][3] = {
{1, 2, 3}, {4, 5, 6}, {7, 0, 0}
};
結構體:
在實際問題中,一組數據每每具備不一樣的數據類型。例如, 在學生登記表中,姓名應爲字符型;學號可爲整型或字符型; 年齡應爲整型;性別應爲字符型;成績可爲整型或實型。 顯然不能用一個數組來存放這一組數據。 由於數組中各元素的類型和長度都必須一致,以便於編譯系統處理。爲了解決這個問題,C語言中給出了另外一種構造數據類型——「結構」。「結構」是一種構造類型,它是由若干「成員」組成的。 每個成員能夠是一個基本數據類型或者又是一個構造類型。 結構既是一種「構造」而成的數據類型,
那麼在說明和使用以前必須先定義它,也就是構造它。如同在說明和調用函數以前要先定義函數同樣。
example:
static std{
char name[10];
int age;
char sex;
float record;
};
訪問結構體成員時使用運算符 .或者 ->,
即 std.name std.age
如果指向結構體指針的話只能使用->,
static std *p;
p->name p->age
定義結構體時不必定須要有結構體名字,如
static {
char name[10];
int age;
char sex;
float record;
};