歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言中的結構體

用戶自己建立自己的結構體類型

1、  定義和使用結構體變量

(1)、結構體的定義

C語言允許用戶自己建立由不同類型數據組成的組合型的數據結構,它稱為結構體

(2)、聲明一個結構體類型的一般形式為:

Struct 結構體名

{ 成員列表 };

1、  定義結構體類型變量

前面的也只是搭建了一個結構體類型,它相當於一個模型,並沒有定義變量,其中並無具體數據,系統對之也不分配存儲單元。

可以采取以下三種方法定義結構體類型的變量:

(1)、先聲明結構體類型,再定義該類型的變量

(2)、在聲明類型的同時定義變量

上面這種定義的一般形式為:

(3)、不指定類型名而直接定義結構體類型變量

注意:

1、  結構體類型和結構體變量是不同的概念,不要混同。區別:只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算;在編譯時,對類型是不分配空間的,只對變量分配空間。

2、  結構體類型中的成員名可以與程序中的變量名相同,但二者不代表同一對象。

3、  對結構體變量中的成員可以單獨使用,它的作用與地位相當於普通變量。

1、  結構體變量的初始化與引用

在定義結構體變量時,可以對他進行初始化,即賦予初始值。

(1)、在定義結構體變量時可以對它的成員進行初始化。初始化列表是用花括號括起來的一些常量,這些常量依次賦給結構體變量中的各成員。注意:對結構體變量初始化,而不是對結構體類型初始化。

(2)、可以引用結構體變量中成員的值,引用方式為:結構體變量名.成員名

“.”是成員運算符。它在所有的運算符中優先級最高。因此可以把student1.name作為一個整體來看待,相當於一個變量。

注意:不能企圖輸出結構體變量名來達到輸出結構體變量所有成員的值。只能對結構體變量中的各個成員分別進行輸入和輸出。

(3)、如果成員本身又屬於一個結構體類型,則要用若干個成員運算符,一級一級的找到最低的一級的成員。只能對最低級的成員進行賦值、存取或運算。

(4)、對結構體變量的成員可以像普通變量一樣進行各種運算。

由於“.”運算符的優先級最高,因此student1.age++是對(student1.age)進行自加運算,而不是先對age進行自加運算。

(5)、同類的結構體變量可以互相賦值。

說明:結構體變量的地址主要用作函數參數,傳遞結構體變量的地址。

==========================================================================

使用結構體數組

1、  定義結構體數組

(1)、定義結構體數組的一般形式是:

a、

b.先聲明結構體類型(如struct Person),然後再用此類型定義結構體數組:

(2)、對結構體數組初始化的形式是在定義數組的後面加上:

==================================================================================

結構體指針

所謂結構體指針就是指向結構體變量的指針,一個結構體變量的起始地址就是這個結構體變量的指針。

1、  指向結構體變量的指針

指向結構體變量的指針變量既可以指向結構體變量,也可以指向結構體數組中的元素。指針變量的基類型必須與結構體變量的類型相同。

說明:為了使用方便和直觀,C語言允許把(*p).name用p->name來代替,“->”代表一個箭頭,p->name表示p指向結構體變量中的name成員。同樣,

(*p).name等價於p->name。“->”稱為指向運算符。

如果p指向一個結構體變量stu,以下三種用法等價:

(1)、stu.成員名(如:stu.name);

(2)、(*p).成員名(如:(*p).name);

(3)、p->成員名(p->name)。

2、指向結構體數組的指針

可以用指針變量指向結構體數組的元素。

注意:

如果p的初值為stu,即指向stu的第一個元素,p加1後,p就指向下一個元素,

例如:

請注意以上2點的不同。

(2)、程序定義了p,是一個指向struct Student類型對象的指針變量,它用來指向一個struct Student類型的對象,不應用來指向stu數組元素中的某一成員。例如下面的用法是不對的:

編譯時將給出“警告”信息,表示地址的類型不匹配,不要認為反正p是存放地址的,可以將任何地址賦給它。如果要將某一成員的地址賦給p,可以用強制類型轉換。先將成員的地址轉換成p的類型。例如:

此時p的值是stu[1]元素的name成員的起始地址。可以用“   ”輸出stu[1]中成員name的值。但是,p仍保持原來的類型,如果執行“ ”,則會輸出stu[2]中name的值。執行p++時,p的值增加了結構體struct Student的長度。

3、用結構體變量和結構體變量的指針作函數參數

將一個結構體變量的值傳遞給另一個函數,有3中方法:

(1)、用結構體變量的成員作參數。例如:用stu[1].name或stu[2].name作為函數實參,將實參的值傳遞給形參。用法和用普通變量作實參是一樣的,屬於“值傳遞方式”。應當注意實參與形參的類型保持一致。

(2)、用結構體變量作實參。用結構體變量作實參時,采取的也是“值傳遞”的方式,將結構體變量所占的內存單元的內容全部按順序傳遞給形參,形參也必須是同類型的結構體變量,在函數調用期間形參也要占用內存單元,這種傳遞方式在空間和時間上的開銷非常大,如果結構體的規模很大時,開銷是很可觀的。此外,由於采用值傳遞方式,如果在執行被調用函數期間改變了形參(也是結構體變量)的值,該值不能返回主調函數,這往往造成使用上的不便。

(3)、用指向結構體變量(或數組元素)的指針作實參,將結構體變量(或數組元素)的地址傳給形參。

Copyright © Linux教程網 All Rights Reserved