當前位置:才華齋>IT認證>嵌入式>

嵌入式開發中C語言中結構體解讀2016

嵌入式 閱讀(1.59W)

嵌入式開發C語言中的結構體你瞭解了嗎?如果不瞭解,請跟yjbys小編一起來看看吧!希望能幫助到大家!

嵌入式開發中C語言中結構體解讀2016

C語言允許使用者自己指定這樣一種資料結構,它由不同型別的資料組合成一個整體,以便引用,這些組合在一個整體中的資料是互相聯絡的,這樣的資料結構稱為結構體,它相當於其它高階語言中記錄。

宣告一個結構休型別的一般形式如下:

struct 結構體名

{成員列表};

結構體名,用作結構體型別的標誌,它又稱 結構體標記,大括號內是該結構體中的各個成員,由它們組成一個結構體,對各成員都應進行型別宣告如:

型別名 成員名;

也可以把 成員列表稱為 域表,第一個成員也稱為結構體中的一個域。成員名定名規則寫變數名同。

struct student

{

int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

};

  2 定義結構體型別變數的方法

前面只是指定了一個結構體型別,它相當於一個模型,但其中並無具體資料,系統對之也不分配實際記憶體單元,為了能在程式中使用結構型別的資料,應當定義結構體型別的變數,並在其中存放具體的資料,可以採取以下3種方法定義結構體型別變數。

(1)先宣告結構體型別再定義變數名

如上面已定義了一個結構體型別 struct student,可以用它來定義變數。如:

struct student //結構體型別名

student1, student2//結構體變數名

定義了 student1, student2 為 struct student 型別的變數。

在定義了結構體變數後,系統會為之分配記憶體單元。例如 student1 和 student2在記憶體中各佔59個位元組。

應當注意,將一個變數定義為標準型別(基本資料型別)與定義為結構體型別不同之處在於後者不僅要求指定變數為結構體型別,而且要求指定為某一特定的結構體型別(例如 struct student 型別),因為可以定義出許多種具體的結構體型別。而在定義變數為整形時,只需指定為 int 型即可。

(2)在宣告型別的同時定義變數

例如:

struct student

{

int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}student1, student2;

它的作用與第一種方法相同,即定義了兩個 struct student 型別的變數 student1, student2 這種形式的定義的一般形式為

struct 結構體名

{

成員表列

}變數名錶列;

(3)直接定義結構型別變數

其一般形式為

struct

{

成員表列

}變數名錶列;

即不出現結構體名。

  關於結構體型別,有幾點要說明:

a. 型別與變數是不同的概念,不是混同,只能對變數賦值,存取或運算,而不能對一個型別賦值,存取或運算。在編譯時,對型別是不分配空間的,只對變數分配空間。

b. 對結構體中的成員(即 域)可以單元使用,它的作用與地位相當於普通變數,

c. 成員也可以是一個結構體變數。

如:

struct date // 宣告一個結構體型別

{

int month;

int day;

int year;

}

struct student

{

int num;

char name[20];

char sex;

int age;

struct date birthday;

char addr[30];

}student1, student2;

先宣告一個 struct date 型別,它代表 日期 包括3個成員 month, day, year。然後在宣告 struct student 型別時,將成員 birthday 指定為 struct date 型別。

d. 成員名可以與程式中的變數名相同,二者不代表同一物件。

  3 結構體變數的引用

(1)不能將一個結構體變數作為一個整體進行輸入和輸出。

只能對結構體變數中的各個成員分別進行輸入輸出。引用結構體變數中的成員的方式為

結構體變數名.成員名

例如 表示 student1 變數中的 num 成員,即 student1 的 num 項,可以對變數的成員賦值。例如:

= 10010;

"." 是成員(分量)運算子,它在所有的運算子中優先順序最高,因此可以把 作為一個整體來看待。上面的賦值語句作用是將整數 10010賦給 student1 變數中的成員 num。

(2)如果成員本身又屬一個結構體型別,則要用若干個成員運算子,一級一級地找到最低一級的成員。只能對最低的成員進行賦值或存取以及運算。

例如:結構體變數 student1 可以這樣訪問各成員:

h

注意,不能用 hday 來訪問 student1 變數中的成員 birthday,因為 birthday 本身是一個結構體變數。

(3)對結構體變數的成員可以像普通變數一樣進行各種運算(根據其型別決定可以進行的運算)。

e = e;

sum = e + e;

++;

++ ;

由於 "." 運算子的優先順序最高,因此 ++ 是對 進行自加運算。而不是先對 age 進行自加運算。

(4)可以引用結構體變數成員的地址。也可以引用結構體變數的地址。如:

scanf("%d", &);// 輸入 的值

printf("%o", &student1);// 輸出 student1 的首地址

但不能用以下語句整體讀入結構體變數如:

scanf("%d,%s,%c,%d,%f,%s", &student1);

結構體變數的地址主要用於作函式引數,傳遞結構體的地址。

  4 結構體變數的初始化

和其它型別變數一樣,對結構體變數可以在定義時指定初始值。

如:

#include

struct student

{

long int num;

char name[20];

char sex;

char addr[30];

}a = {89031, "Li Lin", 'M', "123 Beijing Road"};

void main()

{

printf("NO. : %dnname: %snsex: %cnaddress: %sn", , , , );

}

  5 結構體陣列

一個結構體變數中可以存放一組資料(如一個學生的學號,姓名,成績等資料)。如果有10個學生的資料需要參加運算,顯然應該用陣列,這就是結構體陣列。結構體陣列與以前介紹過的資料值型陣列不同之處在於每個陣列元素都一個結構體型別的資料,它們分別包括各個成員(分量)項。

5.1 定義結構體陣列

和定義結構體變數的方法相仿,只需說明其為陣列即可。

struct student

{

int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

};

struct student stu[3];

以上定義了一個數組 stu,其元素為 struct student 型別資料,陣列有 3 個元素。也可以直接定義一個結構體陣列。如:

struct student

{

int num;

....

}stu[3];

struct

{

int num;

...

}stu[3];

5.2 結構體陣列的初始化

與其它型別陣列一樣,對結構體陣列可以初始化如:

struct student

{

int mum;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu[3] = {{10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"},

{10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"},

{10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"}};

定義陣列 stu 時,元素個數可以不指定,即寫成以下形式:

stu[] = {{...},{...},{...}};

編譯時,系統會根據給出初值的結構體常量的個數來確定陣列元素的個數。

當然,陣列的初始化也可以用以下形式:

struct student

{

int num;

...

};

struct student stu[] = {{...},{...},{...}};

即先宣告結構體型別,然後定義陣列為該結構體型別,在定義陣列時初始化。

從以上可以看到,結構體陣列初始化的一般形式是在定義陣列的後面加上:

5.3 結構體陣列應用舉例

下面例子說明結構體陣列的定義和引用。

#include

#include

#include

struct person

{

char name[20];

int count;

}leader[3] = {{"Li", 0},

{"Zhang", 0},

{"Fun", 0}};

void main()

{

int i, j;

char leader_name[20];

for(i = 1; i<= 10;i++)

{

scanf("%s", leader_name);

for(j=0;j<3;j++)

if(strcmp(leader_name, leader[j]) == 0)

leader[j]t ++;

}

printf("n");

for(i=0;i<3;i++)

printf("%5s: %dn", leader[i], leader[i]t);

system("pause");

}

執行結果如下:

LI

Li

Fun

Zhang

Zhang

Fun

Li

Fun

Zhang

Li

Li: 3

Zhang: 3

Fun: 3

  6 指向結構體型別資料的指標

一個結構體變數的指標就是該變數所佔據的記憶體段的起始地址,可以設一個指標變數,用來指向一個結構體變數,此時該指標變數的值是結構體變數的起始地址。指標變數也可以用來指向結構體陣列中的元素。

6.1 指向結構體變數的指標

指向結構體變數的指標的應用:

#include

#include

#include

struct student

{

long num;

char name[20];

char sex;

float score;

};

void main()

{

struct student stu_1;

struct student *p;