C語言入門(14)——結構體

 

整數、字符、布爾值、浮點數這些數據類型都具備單一的值,這些可稱爲基本數據類型。但字符串是一個例外,它由不少字符組成,像這種由基本類型組成的數據類型稱爲複合數據類型,正如表達式和語句有組合規則同樣,由基本類型組成複合類型也有一些組合規則。數組

在實際問題中,一組數據每每具備不一樣的數據類型。例如,在學生登記表中,姓名應爲字符型;學號可爲整型或字符型;年齡應爲整型;性別應爲字符型;成績可爲整型或實型。顯然不能用一個數組來存放這一組數據。由於數組中各元素的類型和長度都必須一致,以便於編譯系統處理。爲了解決這個問題,C語言中給出了另外一種構造數據類型——「結構」或叫「結構體」。它至關於其它高級語言中的記錄。數據結構

 

「結構」是一種構造類型,它是由若干「成員」組成的。每個成員能夠是一個基本數據類型或者又是一個構造類型。結構既是一種「構造」而成的數據類型,那麼在說明和使用以前必須先定義它,也就是構造它。如同在說明和調用函數以前要先定義函數同樣。ide

 

定義一個結構的通常形式爲:函數

struct 結構名{
       成員表列
   };


成員表列由若干個成員組成,每一個成員都是該結構的一個組成部分。對每一個成員也必須做類型說明,其形式爲:指針

    類型說明符 成員名;code

 

成員名的命名應符合標識符的書寫規定。例如:對象

struct stu{
   int num;
   char name[40];
   char sex;
   float score;
};


在這個結構定義中,結構名爲stu,該結構由4個成員組成。第一個成員爲num,整型變量;第二個成員爲name,字符數組;第三個成員爲sex,字符變量;第四個成員爲score,實型變量。應注意在括號後的分號是不可少的。結構定義以後,便可進行變量說明。凡說明爲結構stu的變量都由上述4個成員組成。因而可知,結構是一種複雜的數據類型,是數目固定,類型不一樣的若干有序變量的集合。blog

 

說明結構變量有如下三種方法。以上面定義的stu爲例來加以說明。內存

 

一、先定義結構,再說明結構變量。字符串

如:

struct stu{
     int num;
     char name[40];
     char sex;
     float score;
};
struct stu boy1, boy2;

說明了兩個變量boy1和boy2爲stu結構類型。

 

也能夠用宏定義使一個符號常量來表示一個結構類型。例如:

#define STU struct stu
STU{
     int num;
     char name[40];
     char sex;
     float score;
};
STU boy1, boy2;

二、在定義結構類型的同時說明結構變量。

例如:

struct stu{
     int num;
     char name[40];
     char sex;
     float score;
}boy1, boy2;

這種形式的說明的通常形式爲:

struct 結構名{
       成員表列
    }變量名錶列;


 

3) 直接說明結構變量。

例如:

struct{
     int num;
     char name[40];
     char sex;
     float score;
}boy1, boy2;

這種形式的說明的通常形式爲:

struct{
       成員表列
    }變量名錶列;

第三種方法與第二種方法的區別在於第三種方法中省去告終構名,而直接給出結構變量。三種方法中說明的boy一、boy2變量都具備下圖所示的結構。

 


說明了boy一、boy2變量爲stu類型後,便可向這兩個變量中的各個成員賦值。在上述stu結構定義中,全部的成員都是基本數據類型或數組類型。成員也能夠又是一個結構,即構成了嵌套的結構。例如,下圖給出了另外一個數據結構。

 


按圖可給出如下結構定義:

struct date{
     int month;
     int day;
     int year;
};
struct{
     int num;
     char name[40];
     char sex;
     struct date birthday;
     float score;
}boy1, boy2;

首先定義一個結構date,由month(月)、day(日)、year(年) 三個成員組成。在定義並說明變量 boy1 和 boy2 時,其中的成員birthday被說明爲data結構類型。成員名可與程序中其它變量同名,互不干擾。

 在程序中使用結構變量時,每每不把它做爲一個總體來使用。在ANSI C中除了容許具備相同類型的結構變量相互賦值之外,通常對結構變量的使用,包括賦值、輸入、輸出、運算等都是經過結構變量的成員來實現的。

 

表示結構變量成員的通常形式是:

結構變量名.成員名


例如:

boy1.num        /*第一我的的學號*/
    boy2.sex         /*第二我的的性別*/


若是成員自己又是一個結構則必須逐級找到最低級的成員才能使用。例如:

boy1.birthday.month

即第一我的出生的月份成員能夠在程序中單獨使用,與普通變量徹底相同。

結構變量的賦值就是給各成員賦值。可用輸入語句或賦值語句來完成。

 

例以下面的例子是給結構變量賦值並輸出其值。

#include <stdio.h>


struct stu
{
	int num;
	char *name;
	char sex;
	float score;
}boy1, boy2 ;


int main(void)
{


	boy1.num = 100;
	boy1.name = "Zhang San";
	printf("請輸入性別和分數:\n");
	scanf("%c,%f", &boy1.sex, &boy1.score);
	boy2 = boy1;
	printf("學號:%d\n姓名:%s\n", boy2.num, boy2.name);
	printf("性別:%c\n分數:%f\n", boy2.sex, boy2.score);


	system("pause");
	return 0;
}
運行結果:



本程序中用賦值語句給num和name兩個成員賦值,name是一個字符串指針變量。用scanf函數動態地輸入sex和score成員值,而後把boy1的全部成員的值總體賦予boy2。最後分別輸出boy2的各個成員值。本例表示告終構變量的賦值、輸入和輸出的方法。

 

與其餘類型變量同樣,也能夠給結構體的每一個成員賦初值,這稱爲結構體的初始化。一種是在定義結構體變量時進行初始化,語法格式以下:

struct 結構體名變量名={初始數據表};


另外一種是在定義結構體類型時進行結構體變量的初始化。

struct  結構體名
   {
          成員列表;
   }變量名={初始數據表};


說明

結構體類型與結構體變量概念不一樣

類型:不分配內存;變量:分配內存

類型:不能賦值、存取、運算;變量:能夠

結構體變量中的成員可單獨使用,方法如普通變量;

結構體可嵌套

結構體成員名與程序中變量名可相同

 

和其餘類型變量同樣,對結構變量能夠在定義時進行初始化賦值。

注意:

一、不能將一個結構體類型變量做爲一個總體加以引用,而只能對結構體類型變量中的各個成員分別引用。

二、若是成員自己又屬一個結構體類型,則要用若干個成員運算符,一級一級地找到最低的一級成員。只能對最低級的成員進行賦值或存取以及運算。

三、對成員變量能夠像普通變量同樣進行各類運算(根據其類型決定能夠進行的運算)。

四、在數組中,數組是不能彼此賦值的,而結構體類型變量能夠相互賦值。在C程序中,同一結構體類型的結構體變量之間容許相互賦值,而不一樣結構體類型的結構體變量之間不容許相互賦值,即便二者包含有一樣的成員。


下面的例子對結構變量初始化。

#include <stdio.h>

struct stu
{
	int num;
	char *name;
	char sex;
	float score;
}boy1, boy2 = { 100, "Zhang San", 'M', 100 };

int main(void)
{
	boy1 = boy2;
	printf("學號:%d\n姓名:%s\n", boy1.num, boy1.name);
	printf("性別:%c\n分數:%f\n", boy1.sex, boy1.score);

	system("pause");
	return 0;
}

運行結果:


本例中,boy二、boy1均被定義爲外部結構變量,並對boy1做了初始化賦值。在main函數中,把boy2的值總體賦予boy1,而後用兩個printf語句輸出boy1各成員的值。

結構是由若干數據項組合而成的複雜數據對象,這些數據項稱爲結構的成員。定義一個結構,須要給出各個成員的類型及名稱。結構定義僅描述了一個結構的形式。要在程序裏使用結構,須要聲明結構變量。訪問結構成員的操做要用圓點運算符(.),通常形式爲:結構變量名.成員名。

相關文章
相關標籤/搜索