詳解C語(yǔ)言中結(jié)構(gòu)體的使用
結(jié)構(gòu)體的聲明
結(jié)構(gòu)體的定義:結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)體的每個(gè)成員可以是不同類型的變量。
舉例:
//定義結(jié)構(gòu)體類型
struct tag//struct結(jié)構(gòu)體關(guān)鍵字 tag結(jié)構(gòu)體標(biāo)簽 struct tag結(jié)構(gòu)體類型
{
//成員變量
char name[20];
short age;
char telphone[12];
char sex[5];
}s1,s2,s3;//s1,s2,s3是三個(gè)全局結(jié)構(gòu)體變量
int main()
{
struct tag s;//s是局部變量
return 0;
}
小tips:結(jié)構(gòu)體類型是不占內(nèi)存空間的,-相當(dāng)于int在C語(yǔ)言中也是不占內(nèi)存的,而int a(定義a變量后就會(huì)占據(jù)內(nèi)存)
使用typedef定義一個(gè)單獨(dú)的變量,因?yàn)槲覀冊(cè)诰帉懘a的過(guò)程中,重復(fù)的書(shū)寫struct會(huì)感覺(jué)很繁瑣,這樣定義之后就可以直接使用改變量作為結(jié)構(gòu)體類型。
舉例:
typedef struct tag//定義tag為結(jié)構(gòu)體別名,tag等價(jià)于struct tag
{
char name[20];
short age;
char telphone[12];
char sex[5];
}tag;//tag指的是類型,而不是變量
int main()
{
struct tag s1;
tag s2;//struct tag==tag,因此tag可以直接使用
return 0;
}
結(jié)構(gòu)體成員的類型
結(jié)構(gòu)體成員的類型可以是標(biāo)量,數(shù)組,指針。其他結(jié)構(gòu)體。
結(jié)構(gòu)體變量的定義和初始化:
#include <stdio.h>
typedef struct tag
{
//結(jié)構(gòu)體成員類型的定義
char name[20];
short age;
char telphone[12];
char sex[5];
}tag;
int main()
{
tag s1={"張三",20,"15372842487"};//結(jié)構(gòu)體變量的初始化
printf("%s的年齡是%d,手機(jī)號(hào)碼為%s\n", s1.name, s1.age, s1.telphone);//輸出有關(guān)該成員的信息,通過(guò)結(jié)構(gòu)體變量找對(duì)應(yīng)的成員變量
struct tag s2={"lisa",19,"8725111"};
printf("%s的年齡是%d,手機(jī)號(hào)碼為%s", s2.name, s2.age, s2.telphone);
return 0;
}
結(jié)果

結(jié)構(gòu)體成員的訪問(wèn)
結(jié)構(gòu)體變量訪問(wèn)成員:結(jié)構(gòu)體變量的成員是通過(guò)點(diǎn)操作符(.)訪問(wèn)的,點(diǎn)操作符接受兩個(gè)操作數(shù)。
例如:
struct stu
{
char name[20];
int age;
}s1={"張三",19};
int main()
{
printf("%s的年齡是%d", s1.name, s1.age);//s1.name和s1.age就是 通過(guò)點(diǎn)操作符訪問(wèn)結(jié)構(gòu)體成員
}
輸出:
張三的年齡是19
結(jié)構(gòu)體傳參數(shù)的時(shí)候,要傳結(jié)構(gòu)體的地址,其原因是函數(shù)傳參的時(shí)候,參數(shù)是需要壓棧的,如果傳遞一個(gè)結(jié)構(gòu)體對(duì)象的時(shí)候,結(jié)構(gòu)體過(guò)大,參數(shù)壓棧的系統(tǒng)開(kāi)銷比較大,因此會(huì)導(dǎo)致性能下降。
舉例:
typedef struct stu
{
char name[20];
int age;
}stu;
void print1(stu tmp)//傳遞結(jié)構(gòu)體的值
{
printf("name:%s\n", tmp.name);
printf("age:%d\n", tmp.age);
}
void print2(stu* ps)//傳遞結(jié)構(gòu)體的地址,開(kāi)辟的空間為一個(gè)指針的大?。?/8個(gè)字節(jié))
{
printf("name:%s\n", ps->name);
printf("age:%d\n", ps->age);
}
int main()
{
stu s = { "張三",19 };
print1(s);
print2(&s);
return 0;
}
輸出:
name:張三
age:19
name:張三
age:19
這里插播一點(diǎn)數(shù)據(jù)結(jié)構(gòu)的知識(shí):數(shù)據(jù)結(jié)構(gòu)分為線性數(shù)據(jù)結(jié)構(gòu)(順序表,鏈表,棧,隊(duì)列)和樹(shù)形數(shù)據(jù)結(jié)構(gòu)(二叉樹(shù),圖)。
順序表:按照一定的順序?qū)⒃貎?chǔ)存起來(lái)。
舉例:

鏈表:用一條線將元素連接起來(lái),不要求元素都在同一條線上。
舉例:

棧:元素先進(jìn)后出,后進(jìn)先出,元素的出入方式類似于手電筒中的電池一樣,向一個(gè)不含任何元素的棧中放入一個(gè)元素的過(guò)程叫壓棧,刪除棧中的一個(gè)元素的過(guò)程,叫出棧,棧中元素的刪除也是由棧頂鄉(xiāng)下進(jìn)行刪除,因此如果想刪除棧中元素,不能直接刪除,必須將在該元素后面放入的元素都進(jìn)行刪除。
舉例:

實(shí)例分析:
int add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 10;
int b = 20;
int ret = 0;
ret = add(a, b);
printf("%d\n",ret);
return 0;
}
輸出:
30

函數(shù)在調(diào)用的時(shí)候,實(shí)參的傳遞順序是從右到左,將a,b放入x,y的過(guò)程叫壓棧。
到此這篇關(guān)于詳解C語(yǔ)言中結(jié)構(gòu)體的使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言 結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言示例講解結(jié)構(gòu)體的聲明與初始化方法
- C語(yǔ)言詳細(xì)分析結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則
- C語(yǔ)言中的自定義類型之結(jié)構(gòu)體與枚舉和聯(lián)合詳解
- C語(yǔ)言結(jié)構(gòu)體數(shù)組常用的三種賦值方法(包含字符串)
- C語(yǔ)言深入回顧講解結(jié)構(gòu)體對(duì)齊
- C語(yǔ)言深入講解指針與結(jié)構(gòu)體的使用
- C語(yǔ)言深入探究自定義類型之結(jié)構(gòu)體與枚舉及聯(lián)合
- C語(yǔ)言中結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則講解
- C語(yǔ)言全面梳理結(jié)構(gòu)體知識(shí)點(diǎn)
相關(guān)文章
C++實(shí)現(xiàn)封裝的順序表的操作與實(shí)踐
在程序設(shè)計(jì)中,順序表是一種常見(jiàn)的線性數(shù)據(jù)結(jié)構(gòu),通常用于存儲(chǔ)具有固定順序的元素,與鏈表不同,順序表中的元素是連續(xù)存儲(chǔ)的,因此訪問(wèn)速度較快,但插入和刪除操作的效率可能較低,本文將詳細(xì)介紹如何用 C++ 語(yǔ)言實(shí)現(xiàn)一個(gè)封裝的順序表類,深入探討順序表的核心操作2025-02-02
C++實(shí)現(xiàn)LeetCode(55.跳躍游戲)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(55.跳躍游戲),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單電子通訊錄
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單電子通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06

