最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章帶你用C語言玩轉(zhuǎn)結(jié)構(gòu)體

 更新時間:2021年09月27日 11:44:40   作者:波風(fēng)張三  
本文主要介紹C語言 結(jié)構(gòu)體的知識,學(xué)習(xí)C語言肯定需要學(xué)習(xí)結(jié)構(gòu)體,這里詳細(xì)說明了結(jié)構(gòu)體并附示例代碼,供大家參考學(xué)習(xí),有需要的小伙伴可以參考下

前言

C語言提供了不同的數(shù)據(jù)類型,比如說int、float、double、char等,不同的類型決定了一個變量在內(nèi)存中應(yīng)該占據(jù)的空間以及表現(xiàn)形式。

但是,當(dāng)我們定義一個人的時候,人的不同屬性就比較難用同一個數(shù)據(jù)類型來定義了,因為人的身高、年齡、體重等屬性往往需要不同數(shù)據(jù)類型,在這個時候,我們便引入結(jié)構(gòu)體這個概念。

一、結(jié)構(gòu)體的聲明與定義

1.結(jié)構(gòu)體的聲明

結(jié)構(gòu)是一些值的集合,這些值稱為成員變量。結(jié)構(gòu)的每個成員可以是不同類型的變量

當(dāng)我們面對的事物有多個不同的數(shù)據(jù)類型的時候,我們就可以使用結(jié)構(gòu)體來組織了。

比如說,一本書有書名、作者、售價、出版日期等等不同的數(shù)據(jù)類型,這時候我們可以創(chuàng)建結(jié)構(gòu)體來包含書的不同數(shù)據(jù)類型。

而結(jié)構(gòu)體聲明是描述結(jié)構(gòu)體組合的主要方法,語法格式為:

struct 結(jié)構(gòu)體名稱
{
結(jié)構(gòu)體成員1;
結(jié)構(gòu)體成員2;
結(jié)構(gòu)體成員3;

};//分號不能丟

【注意】

結(jié)構(gòu)體成員既可以是任何一種基本的數(shù)據(jù)類型,也可以是另一種結(jié)構(gòu)體,如果是后者就相當(dāng)于結(jié)構(gòu)體的嵌套。(俗稱套娃)

例如:

struct Book//描述一本書的相關(guān)屬性,其中Book是這個框架的名稱
{
	char name[20];//書名
	char author[20];//作者
	float price;//價格
};//分號一定不能丟

這樣就相當(dāng)于描述了一本書的框架。

2.結(jié)構(gòu)成員的類型

結(jié)構(gòu)成員的類型可以是標(biāo)量、數(shù)組、指針、甚至是其他結(jié)構(gòu)體。

3.結(jié)構(gòu)體的定義

結(jié)構(gòu)體的聲明只是進(jìn)行一個簡單的描述,實際上在沒有定義結(jié)構(gòu)體類型變量之前,它是不會在內(nèi)存中分配空間的。

也就是說,它還沒有被真正使用,虛擬存在,只有定義了結(jié)構(gòu)體類型變量,才真實存在。

舉個例子,上面定義了書的框架

struct Book//描述一本書的相關(guān)屬性,其中Book是這個框架的名稱
{
	char name[20];//書名
	char author[20];//作者
	float price;//價格
};//分號一定不能丟

這里在編譯器中,并不會分配內(nèi)存空間,它僅僅是虛擬存在。而一旦我們定義了結(jié)構(gòu)體類型變量,它就可以被分配空間了。

比如:

struct Book//描述一本書的相關(guān)屬性,其中Book是這個框架的名稱
{
	char name[20];//書名
	char author[20];//作者
	float price;//價格
};//分號一定不能丟
int main()
{
	struct Book book;//局部變量--放在棧區(qū)
	return 0;
}

我們在上面例子中也可以注意到,定義結(jié)構(gòu)體變量的語法是:

struct 結(jié)構(gòu)體名稱 結(jié)構(gòu)體變量名

此外,還可以在結(jié)構(gòu)體聲明的時候定義結(jié)構(gòu)體變量

struct Book//描述一本書的相關(guān)屬性
{
	char name[20];
	char author[20];
	float price;
}b1,b2;//b1,b2是全局變量。放在靜態(tài)區(qū)
int main()
{
	struct Book book;//局部變量--放在棧區(qū)
	return 0;
}

b1、b2結(jié)構(gòu)體變量是一個全局變量,在其他函數(shù)中也可以對它進(jìn)行訪問。

二、初始化結(jié)構(gòu)體

我們在定義一個變量或數(shù)組的時候可以對其進(jìn)行初始化,

例如:

int a=10;
int arr[10]={1,2,3,4,5,6,7,8,9,0};

同理,定義結(jié)構(gòu)體變量的時候,我們也可以同時為其初始化

struct Book//描述一本書的相關(guān)屬性
{
	char name[20];
	char author[20];
	float price;
}b1,b2;//b1,b2是全局變量。放在靜態(tài)區(qū)
int main()
{
	struct Book book=
	{
	"《笑傲江湖》","金庸",30
	};//這樣的話,就將結(jié)構(gòu)體變量初始化了,也就是定義變量的同時賦初值
	return 0;
}

三、訪問結(jié)構(gòu)體成員

結(jié)構(gòu)體變量訪問成員 結(jié)構(gòu)變量的成員是通過點(diǎn)操作符(.)訪問的。點(diǎn)操作符接受兩個操作數(shù)。

比如,book.name就是引用book結(jié)構(gòu)體變量的name成員,它是一個字符數(shù)組。

#include <stdio.h>
struct Book//描述一本書的相關(guān)屬性
{
	char name[20];
	char author[20];
	float price;
}b1, b2;//b1,b2是全局變量。放在靜態(tài)區(qū)
int main()
{
	struct Book book=
	{
		"《笑傲江湖》", "金庸", 30
	};//這樣的話,就將結(jié)構(gòu)體變量初始化了,也就是定義變量的同時賦初值
	printf("%s %s %f\n", book.name, book.author, book.price);
//用. 來訪問
	return 0;
}

在這里插入圖片描述

四、結(jié)構(gòu)體嵌套

如果訪問嵌套的結(jié)構(gòu)體成員的話,就需要使用多層點(diǎn)號運(yùn)算符來進(jìn)行操作。因為C語言的結(jié)構(gòu)體只能對最底層的成員進(jìn)行訪問,如果存在多級結(jié)構(gòu)體嵌套的話,就需要一級一級地深入,直到找到最底層的成員才行

struct S
{
	int a;
	char c;
	double d;
};
struct T
{
	struct S s;//結(jié)構(gòu)體嵌套
	char name[20];
	int num;
};
int main()
{
	struct T t = { {100,'c',3.14},"里斯",30 };
	printf("%d %c %f %s %d\n", t.s.a, t.s.c, t.s.d, t.name, t.num);//使用了兩層點(diǎn)號運(yùn)算符尋找成員
	return 0;
}

在這里插入圖片描述

五、結(jié)構(gòu)體指針

在開頭的時候說過,結(jié)構(gòu)的成員可以是標(biāo)量、數(shù)組、指針。

在這里,我們來認(rèn)識一下結(jié)構(gòu)體指針。

struct Book *pt;

這里聲明了一個指向Book結(jié)構(gòu)體類型的指針變量pt

struct S
{
	int a;
	char c;
	double d;
};
struct T
{
	struct S s;
	char name[20];
	int num;
};
int main()
{
	struct T t = { {100,'c',3.14},"里斯",30 };
	printf("%d %c %f %s %d\n", t.s.a, t.s.c, t.s.d, t.name, t.num);
	struct T*pt = &t;//拿到地址的方式
	printf("%d %c %f %s %d\n", (*pt).s.a, (*pt).s.c, (*pt).s.d, (*pt).name, (*pt).num);
	printf("%d %c %f %s %d\n",pt->s.a,pt->s.c,pt->s.d,pt->name,pt->num);
	return 0;
}

【注意】數(shù)組名指向的是第一個元素的地址,所以可以直接將數(shù)組名賦值給指針變量。但是結(jié)構(gòu)體變量的變量名并不是指向該結(jié)構(gòu)體的地址,所以要使用取地址運(yùn)算符(&)才能獲取其地址。

如上面的:

struct T*pt = &t;//拿到地址的方式

通過上面的例子我們也可以發(fā)現(xiàn),通過結(jié)構(gòu)體指針訪問結(jié)構(gòu)體成員有以下兩種方法:

(1)(*結(jié)構(gòu)體指針).成員名
(2)結(jié)構(gòu)體指針->成員名

第一種由于點(diǎn)號運(yùn)算符(.)比指針的取值運(yùn)算符(*)優(yōu)先級高,所以要使用小口號先對指針進(jìn)行解引用,讓它變成該結(jié)構(gòu)體變量,再用點(diǎn)運(yùn)算符取訪問其成員。

以上兩種方法在實現(xiàn)的時候完全等價。但是,切記,點(diǎn)號(.)只能用于結(jié)構(gòu)體,而箭頭(->)只能用于結(jié)構(gòu)體指針。

【打印結(jié)果一樣】

在這里插入圖片描述

當(dāng)二者皆可用的時候,優(yōu)先采用第二種方法,因為箭頭具有指向性,很直觀的就可以把它與指針聯(lián)系起來了。

六、結(jié)構(gòu)體傳參

函數(shù)調(diào)用的時候,參數(shù)的傳遞就是值傳遞的過程,也就是將實參傳給形參的過程。所以,結(jié)構(gòu)體變量可以作為函數(shù)的參數(shù)傳遞,兩個相同結(jié)構(gòu)體類型的結(jié)構(gòu)體變量也支持直接賦值。

struct S
{
	int arr[100];
	int num;
	char ch;
	double d;
};
//結(jié)構(gòu)體傳參
void print1(struct S ss)
{
	printf("%d %d %d %c %1f", ss.arr[0],ss.arr[2],ss.num,ss.ch,ss.d);
}
//結(jié)構(gòu)體地址傳參
void print2(struct S*ps)
{
	printf("%d %d %d %c %1f", ps->arr[0], ps->arr[2], ps->num, ps->ch, ps->d);
}
int main()
{
	struct S s = { {1,2,3,4,5}, 100, 'w',3.14  };
	print1(s);//傳結(jié)構(gòu)體
	print2(&s);//傳地址
	return 0;
}

在這里插入圖片描述

可以看到,確實把參數(shù)傳遞過去了。

那么,上面的 print1 和 print2 函數(shù)哪個好些?

答案是:首選print2函數(shù)。 原因:

函數(shù)傳參的時候,參數(shù)是需要壓棧的。 如果傳遞一個結(jié)構(gòu)體對象的時候,結(jié)構(gòu)體過大,參數(shù)壓棧的的系統(tǒng)開銷比較大,所以會導(dǎo)致性能的下降。

因此,結(jié)構(gòu)體傳參的時候,要傳結(jié)構(gòu)體的地址。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出

    C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出

    這篇文章主要介紹了C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出,C語言的語句用來向計算機(jī)系統(tǒng)發(fā)出操作指令。一條語句編寫完成經(jīng)過編譯后產(chǎn)生若干條機(jī)器指
    2022-07-07
  • c++中的自增/自減操作方式

    c++中的自增/自減操作方式

    這篇文章主要介紹了C++中的自增和自減運(yùn)算符,包括前綴和后綴形式,并通過一個具體的例子解釋了自增/自減表達(dá)式的值與函數(shù)參數(shù)傳遞的關(guān)系,文章指出,自增/自減表達(dá)式的值是在表達(dá)式求值時確定的,而不是在自增/自減運(yùn)算后
    2025-03-03
  • C語言實現(xiàn)簡易的三子棋小游戲

    C語言實現(xiàn)簡易的三子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡易的三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++實現(xiàn)區(qū)塊鏈的源碼

    C++實現(xiàn)區(qū)塊鏈的源碼

    這篇文章主要介紹了C++實現(xiàn)區(qū)塊鏈的源碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • OpenCV中findContours函數(shù)參數(shù)詳解

    OpenCV中findContours函數(shù)參數(shù)詳解

    Opencv中通過使用findContours函數(shù),簡單幾個的步驟就可以檢測出物體的輪廓,很方便。本文將和大家一起探討一下findContours方法中各參數(shù)的含義及用法,感興趣的可以了解一下
    2022-08-08
  • C++代碼實現(xiàn)逆波蘭式

    C++代碼實現(xiàn)逆波蘭式

    這篇文章主要為大家詳細(xì)介紹了C++代碼實現(xiàn)逆波蘭式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++產(chǎn)生隨機(jī)數(shù)的實現(xiàn)代碼

    C++產(chǎn)生隨機(jī)數(shù)的實現(xiàn)代碼

    本篇文章是對C++中產(chǎn)生隨機(jī)數(shù)的實現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ string字符串的使用和簡單模擬實現(xiàn)

    C++ string字符串的使用和簡單模擬實現(xiàn)

    C語言中,字符串是以'\0'結(jié)尾的一些字符的集合,為了操作方便,C標(biāo)準(zhǔn)庫中提供了一些str系列的庫函數(shù),但是這些庫函數(shù)和字符串是分離的,本文給大家介紹了C++ string字符串的使用和簡單模擬實現(xiàn),感興趣的朋友可以參考下
    2024-06-06
  • C語言指針詳解及用法示例

    C語言指針詳解及用法示例

    這篇文章主要介紹了C語言指針詳解及用法示例,介紹了其相關(guān)概念,然后分享了幾種用法,具有一定參考價值。需要的朋友可以了解下。
    2017-11-11
  • C++?11新特性之右值引用使用案例與應(yīng)用場景

    C++?11新特性之右值引用使用案例與應(yīng)用場景

    右值引用和move語義是C++ 11中重要的特性之一,可以提高程序的效率和性能,右值引用是一種新的引用類型,下面這篇文章主要給大家介紹了關(guān)于C++?11新特性之右值引用使用案例與應(yīng)用場景的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評論

怀化市| 绵阳市| 安国市| 蛟河市| 葵青区| 太原市| 浏阳市| 望江县| 日土县| 天峨县| 三门县| 沁源县| 武胜县| 蒙城县| 永昌县| 新蔡县| 准格尔旗| 沁水县| 永修县| 尉犁县| 伊川县| 定襄县| 枣阳市| 文昌市| 香河县| 呼伦贝尔市| 黎川县| 晋城| 望城县| 邵武市| 东莞市| 宁南县| 班戈县| 彩票| 通河县| 苍溪县| 仁怀市| 惠水县| 阿鲁科尔沁旗| 遵义市| 沈丘县|