當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > 嵌入式學(xué)習(xí)筆記:c語(yǔ)言結(jié)構(gòu)體的定義和使用
c高級(jí)結(jié)構(gòu)體如何來(lái)學(xué)習(xí),這里分享一些學(xué)習(xí)筆記,可以輕松學(xué)c高級(jí)結(jié)構(gòu)體。
【1】結(jié)構(gòu)體數(shù)組
(1)結(jié)構(gòu)體數(shù)組的定義
1)具有相同結(jié)構(gòu)體類型的結(jié)構(gòu)體變量也可以組成數(shù)組,稱它們?yōu)榻Y(jié)構(gòu)體數(shù)組。
結(jié)構(gòu)體數(shù)組的每一個(gè)數(shù)組元素都是結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個(gè)成員(分量)項(xiàng)。
2)定義結(jié)構(gòu)體數(shù)組的方法和定義結(jié)構(gòu)體變量的方法相仿,只需說(shuō)明其為數(shù)組即可。
可以采用三種方法:
a. 先定義結(jié)構(gòu)體類型,再用它定義結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組的定義形式如下:
struct 結(jié)構(gòu)體名
{
成員表列;
};
struct 結(jié)構(gòu)體名
例如:
struct student
{
char name[20];
char sex;
int age;
char addr[20];
};
struct student stu[3];
b. 在定義結(jié)構(gòu)體類型同時(shí)定義結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組的定義形式如下:
struct 結(jié)構(gòu)體名
{
成員表列;
}數(shù)組名[元素個(gè)數(shù)];
例如:
struct student
{
char name[20];
char sex;
int age;
char addr[20];
}stu[3];
c. 直接定義結(jié)構(gòu)體數(shù)組
結(jié)構(gòu)體數(shù)組的定義形式如下:
struct //沒(méi)有結(jié)構(gòu)體名
{
成員表列;
}數(shù)組名[元素個(gè)數(shù)];
例如:
struct
{
char name[20];
char sex;
int age;
char addr[20];
}stu[3];
(2)結(jié)構(gòu)體數(shù)組的初始化
結(jié)構(gòu)體數(shù)組在定義的同時(shí)也可以進(jìn)行初始化,并且與結(jié)構(gòu)體變量的初始化規(guī)定相
同,
只能對(duì)全局的或靜態(tài)存儲(chǔ)類別的結(jié)構(gòu)體數(shù)組初始化。
結(jié)構(gòu)體數(shù)組初始化的一般形式是:
struct 結(jié)構(gòu)體名
{
成員列表;
};
struct 結(jié)構(gòu)體名 數(shù)組名[元素個(gè)數(shù)]={初始數(shù)據(jù)表};或者:
struct 結(jié)構(gòu)體名
{
成員表列;
}數(shù)組名[元素個(gè)數(shù)]={初始數(shù)據(jù)表};
由于結(jié)構(gòu)體變量是由若干不同類型的數(shù)據(jù)組成,而結(jié)構(gòu)體數(shù)組又是由若干結(jié)構(gòu)體變量組成。
所以要特別注意包圍在大括號(hào)中的初始數(shù)據(jù)的順序,以及它們與各個(gè)成員項(xiàng)間的對(duì)應(yīng)關(guān)系。
(3)結(jié)構(gòu)體數(shù)組的使用
一個(gè)結(jié)構(gòu)體數(shù)組的元素相當(dāng)于一個(gè)結(jié)構(gòu)體變量,因此前面介紹的有關(guān)結(jié)構(gòu)體變量的規(guī)則也適應(yīng)于結(jié)構(gòu)體數(shù)組元素。
以上面定義的結(jié)構(gòu)體數(shù)組 stu[3]為例說(shuō)明對(duì)結(jié)構(gòu)體數(shù)組的引用:
1)引用某一元素中的成員。
若要引用數(shù)組第二個(gè)元素的 name 成員,則可寫為:
stu[1].name
2)可以將一個(gè)結(jié)構(gòu)體數(shù)組元素值賦給同一結(jié)構(gòu)體類型的數(shù)組中的另一個(gè)元素,或賦給同一類型的變量。
如:
struct student stu[3],student1;
現(xiàn)在定義了一個(gè)結(jié)構(gòu)體類型的數(shù)組,它有 3 個(gè)元素,又定義了一個(gè)結(jié)構(gòu)體類型變量student1,則下面的賦值是合法的。
student1=stu[0];
stu[0]=stu[1];
stu[1]=student1;
3)不能把結(jié)構(gòu)體數(shù)組元素作為一個(gè)整體直接進(jìn)行輸入輸出。如:
printf(“…”,stu[0]);
或
scanf(“…”,&stu[0]);
都是錯(cuò)誤的。
只能以單個(gè)成員為對(duì)象進(jìn)行輸入輸出,如:
scanf(“…”,stu[0].name);
scanf(“…”,&stu[1].num);
printf(“…”,stu[0].name);
printf(“…”,stu[1].num);
(4)結(jié)構(gòu)體指針
可以設(shè)定一個(gè)指針變量用來(lái)指向一個(gè)結(jié)構(gòu)體變量。此時(shí)該指針變量的值是結(jié)構(gòu)體變量的起始地址,該指針?lè)Q為結(jié)構(gòu)體指針。
結(jié)構(gòu)體指針與前面介紹的各種指針變量在特性和方法上是相同的。與前述相同,在程序中結(jié)構(gòu)體指針也是通過(guò)訪問(wèn)目標(biāo)運(yùn)算“*”訪問(wèn)它的對(duì)象。
結(jié)構(gòu)體指針在程序中的一般定義形式為:
struct 結(jié)構(gòu)體名 *結(jié)構(gòu)指針名;
其中的結(jié)構(gòu)體名必須是已經(jīng)定義過(guò)的結(jié)構(gòu)體類型。
例如,
對(duì)于上一節(jié)中定義的結(jié)構(gòu)體類型 struct student,
可以說(shuō)明使用這種結(jié)構(gòu)體類型的結(jié)構(gòu)指針如下:
struct student *pstu;
其中 pstu 是指向 struct student 結(jié)構(gòu)體類型的指針。結(jié)構(gòu)體指針的說(shuō)明規(guī)定了它的數(shù)據(jù)特性,并為結(jié)構(gòu)體指針本身分配了一定的內(nèi)存空間。
但是指針的內(nèi)容尚未確定,即它指向隨機(jī)的對(duì)象。
當(dāng)表示指針變量 p 所指向的結(jié)構(gòu)體變量中的成員時(shí),“(*結(jié)構(gòu)體指針名).成員名”這種表示形式總是需要使用圓括號(hào),顯得很不簡(jiǎn)煉。
因此,對(duì)于結(jié)構(gòu)體指針指向的結(jié)構(gòu)體成員項(xiàng),給出了另外一種簡(jiǎn)潔的表示方法,如下表
示:
結(jié)構(gòu)體指針名->成員名
它與前一種表示方法在意義上是完全等價(jià)的。
例如,結(jié)構(gòu)體指針 p 指向的結(jié)構(gòu)體變量中的成員 name 可以表示如下:
(*p).name 或 p->name