欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言結(jié)構(gòu)體的一些理解

 更新時(shí)間:2020年11月25日 12:13:34   作者:陳森林木  
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言結(jié)構(gòu)體的一些理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

最忙碌的一周已然結(jié)束,疲憊之余想和大家聊一聊對(duì)C語(yǔ)言中結(jié)構(gòu)體的認(rèn)識(shí)。水平不足,如有問(wèn)題請(qǐng)大家指正。

一、對(duì)結(jié)構(gòu)體的理解

我們知道C語(yǔ)言中有基本數(shù)據(jù)類(lèi)型:

1、整(數(shù))型:

int:基本整型,用于存儲(chǔ)整數(shù),占4個(gè)字節(jié),默認(rèn)值為0

short:短整型,占2個(gè)字節(jié)

long:長(zhǎng)整型,占4個(gè)字節(jié)

long long:雙長(zhǎng)整型,占8個(gè)字節(jié),比較少用

2、浮點(diǎn)型

float:?jiǎn)尉雀↑c(diǎn)型,占4個(gè)字節(jié)

double:雙精度浮點(diǎn)型,占8個(gè)字節(jié)

3、字符型

char:字符型,用于存儲(chǔ)單字符,占1個(gè)字節(jié)。

(與Java等語(yǔ)言不同的是,c語(yǔ)言中沒(méi)有字符串類(lèi)型,需要使用字符型數(shù)組來(lái)存放字符串)

// 定義字符型數(shù)組并賦值
 char string[3]; 
 string = ”abc”;

除了這些簡(jiǎn)單的、不可拆分的原子數(shù)據(jù)類(lèi)型,還存在著復(fù)合數(shù)據(jù)類(lèi)型(也叫構(gòu)造類(lèi)型),如枚舉類(lèi)型、數(shù)組類(lèi)型、結(jié)構(gòu)體類(lèi)型、共用體類(lèi)型,這里我們要討論的就是其中的結(jié)構(gòu)體類(lèi)型。

注:我認(rèn)為,數(shù)據(jù)類(lèi)型其實(shí)包含了兩個(gè)概念,首先是將具有相同屬性的數(shù)據(jù)處理成一個(gè)集合,使屬性得以被限定、區(qū)分(如int a=“A”;是錯(cuò)誤的);其次是在這個(gè)集合上定義了一些操作,如int型的加減乘除運(yùn)算。

二、結(jié)構(gòu)體的定義

1.標(biāo)準(zhǔn)定義的格式說(shuō)明

struct 結(jié)構(gòu)名 
 { 
  數(shù)據(jù)類(lèi)型 變量名; 
  數(shù)據(jù)類(lèi)型 變量名; 
  ... 
 } ; 

struct關(guān)鍵字用來(lái)聲明結(jié)構(gòu)體,花括號(hào)內(nèi)的結(jié)構(gòu)體成員由我們?nèi)我獍l(fā)揮(若存在相同的數(shù)據(jù)類(lèi)型,也可以簡(jiǎn)寫(xiě):int a,b,c;)。

這里的結(jié)構(gòu)名叫做結(jié)構(gòu)體的標(biāo)識(shí)符,類(lèi)似于int a中的int,但僅僅是類(lèi)似,請(qǐng)看下面:

//定義一個(gè)名為student的結(jié)構(gòu)體
struct student{  
	char name[8];  
	int age;  
	char sex[2];  
}; 

現(xiàn)在我們只是按照自己的需求,完成了對(duì)結(jié)構(gòu)體student的定義,然而這僅僅是個(gè)模版,編譯后并沒(méi)有為其分配空間,下面讓我們?nèi)ナ褂眠@個(gè)新的數(shù)據(jù)類(lèi)型:

student stu;//報(bào)錯(cuò) 

在上面提到student這個(gè)標(biāo)識(shí)符只是類(lèi)似于基本數(shù)據(jù)類(lèi)型的類(lèi)型名稱(chēng),因?yàn)橐胪耆诟拍钌系葍r(jià),我們需要在前面加上struct關(guān)鍵字,即struct student是一個(gè)整體,不可以省去struct:

struct student stu; //成功編譯

現(xiàn)在,我們已經(jīng)成功定義了一個(gè)變量stu,系統(tǒng)為其分配了該數(shù)據(jù)類(lèi)型(結(jié)構(gòu)體)所需要的儲(chǔ)存空間。
以上兩部分還可以簡(jiǎn)寫(xiě)在一起:

struct student{  
	char name[8];  
	int age;  
	char sex[2];  
}stu;//將stu寫(xiě)在尾綴,構(gòu)造結(jié)構(gòu)體的同時(shí)完成了對(duì)結(jié)構(gòu)體變量的定義,如需多個(gè)結(jié)構(gòu)體變量,可以使用逗號(hào)分隔開(kāi) 
struct student{  
	char name[8];  
	int age;  
	char sex[2];  
}stu1,stu2,stu3;//同時(shí)定義多個(gè)結(jié)構(gòu)體變量,如果需要定義多個(gè)具有相同模式的結(jié)構(gòu)體變量時(shí)用這種方法比較方便

到這里,你有沒(méi)有想過(guò)能不能省略結(jié)構(gòu)體名稱(chēng)呢?可以。此時(shí)定義的結(jié)構(gòu)體稱(chēng)為匿名結(jié)構(gòu)體(也叫無(wú)名結(jié)構(gòu)體):

struct{  
	char name[8];  
	int age;  
	char sex[2];  
}stu1,stu2,stu3;//省略掉標(biāo)識(shí)符后,依然能完成變量的定義,但此時(shí)要注意,我們已經(jīng)無(wú)法通過(guò)在結(jié)構(gòu)體外定義新的該結(jié)構(gòu)體的變量了,所以匿名結(jié)構(gòu)體僅僅在確定不會(huì)再定義其他結(jié)構(gòu)體變量的時(shí)候使用

2.含typedef定義的格式說(shuō)明

typedef關(guān)鍵字,作用是給一種數(shù)據(jù)類(lèi)型定義一個(gè)新名字。這里的數(shù)據(jù)類(lèi)型包括內(nèi)部數(shù)據(jù)類(lèi)型(int,char等基本數(shù)據(jù)類(lèi)型)和自定義的數(shù)據(jù)類(lèi)型(struct等)。使用typedef起別名有兩個(gè)好處,一是給變量一個(gè)易記、含義明確的新名字,二是簡(jiǎn)化一些比較復(fù)雜的類(lèi)型聲明(如struct student中的struct)。

typedef struct student{   
	char name[8];   
	int age;   
	char sex[2];   
}xuesheng;
xuesheng stu;//省略struct,使用別名完成變量stu的創(chuàng)建

現(xiàn)在,仔細(xì)閱讀的你不難發(fā)現(xiàn):此時(shí)尾綴xuesheng的地位已經(jīng)不可與同日而語(yǔ)了,時(shí)過(guò)境遷,它不再是我們偷懶定義出來(lái)的變量,而是結(jié)構(gòu)體student的別名了,此時(shí)struct student與xuesheng等價(jià)。

typedef struct{   
	char name[8];   
	int age;   
	char sex[2];   
}xuesheng;//這里的student依然可以去掉!即使去掉,我們也可以在以后去使用它的別名xuesheng

三.結(jié)構(gòu)體的賦值

一個(gè)變量的初始化其實(shí)包含兩個(gè)內(nèi)容,一是創(chuàng)建變量,二是為變量賦值以使用?,F(xiàn)在讓我們賦值吧。

1、定義結(jié)構(gòu)體之后進(jìn)行賦值:

a.逐個(gè)賦值:

stu.name = "Jack";//錯(cuò)誤,不能直接給數(shù)組名賦值,因?yàn)閿?shù)組名是一個(gè)常量
strcpy(stu.name, "Chenhao");//不能直接給數(shù)組名賦值,因?yàn)閿?shù)組名是一個(gè)常量。
stu.num = 21;
strcpy(stu.sex, "男");

b.整體賦值:

stu = (struct Student){"Chenhao", 21, "男"};//此時(shí)需要強(qiáng)制類(lèi)型轉(zhuǎn)換,因?yàn)閿?shù)組賦值也是使用{},不轉(zhuǎn)換的話(huà)系統(tǒng)無(wú)法區(qū)分!
stu = (xuesheng){"Chenhao", 21, "男"};//別忘了也可以用等價(jià)的別名喲~

2、定義結(jié)構(gòu)體同時(shí)完成賦值:

struct student{   
	char name[8];   
	int age;   
	char sex[2];   
}stu = {"Chenhao", 21, "男"};//此時(shí)很直觀是在為結(jié)構(gòu)體變量賦值,因此不需要強(qiáng)制類(lèi)型轉(zhuǎn)換

3、復(fù)制已經(jīng)初始化的結(jié)構(gòu)體變量以進(jìn)行賦值:

struct student{   
	char name[8];   
	int age;   
	char sex[2];   
}stu = {"Chenhao", 21, "男"};
struct student stu1 = stu;//不是通過(guò)指針指向來(lái)賦值,確確實(shí)實(shí)是復(fù)制了一份相同的stu成員變量給放到了新變量stu1的存儲(chǔ)空間里,也就是stu1如實(shí)地開(kāi)辟了自己的空間

以上賦值的方式需要注意初始化值的類(lèi)型和順序要與結(jié)構(gòu)體聲明時(shí)成員對(duì)應(yīng)的類(lèi)型和順序保持一致!另外,部分初始化的方式請(qǐng)移步自行查閱。

四.結(jié)構(gòu)體的使用

與結(jié)構(gòu)體數(shù)組的成員訪(fǎng)問(wèn)相同,一樣放在結(jié)構(gòu)體數(shù)組中講。

五.結(jié)構(gòu)體數(shù)組(一維)

結(jié)構(gòu)體類(lèi)型也與基本數(shù)據(jù)類(lèi)型一樣,可以作為數(shù)組的元素的類(lèi)型。

結(jié)構(gòu)數(shù)組定義格式:

struct 結(jié)構(gòu)名 { 
成員列表 
} 數(shù)組名[數(shù)組長(zhǎng)度]; 

如:

struct student{
 char name[8];   
	int age;   
	char sex[2]; 
}stu[145];//定義一個(gè)結(jié)構(gòu)結(jié)構(gòu)數(shù)組stu,共有145個(gè)元素,即145個(gè)學(xué)生的學(xué)生信息

結(jié)構(gòu)體數(shù)組的賦值

//整體賦值:
stu = (struct Student){{"Zhangsan", 18, "男"},{"Lisi", 15, "女"},......}; 
stu[0] = (struct Student){"Chenhao", 21,"男"};
//結(jié)構(gòu)體變量成員逐個(gè)賦值:
strcpy(stu[144].name, "Smith");
stu[144].age = 10;
stu[144].sex = "女";
//逐個(gè)輸出結(jié)構(gòu)數(shù)組的元素
int length = sizeof(stu) / sizeof(struct student);//結(jié)構(gòu)體數(shù)組的長(zhǎng)度,結(jié)構(gòu)體數(shù)組變量大小/單個(gè)模版大小
for (int i = 0; i<length; i++) { 
 printf("姓名:%s 年齡:%d 性別:%s \n", stu[i].name, stu[i].age, stu[i].sex);
}

結(jié)構(gòu)體數(shù)組小歸納:

名稱(chēng) 含義
stu student結(jié)構(gòu)體數(shù)組
stu[2] student結(jié)構(gòu)的一個(gè)變量,為第三個(gè)同學(xué)
stu[2].name char型數(shù)組,第三個(gè)同學(xué)的名字?jǐn)?shù)組
stu[2].name[0] 第三個(gè)同學(xué)的名字的首字母

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

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

//直接
struct student{
 char name[8];   
	int age;   
	char sex[2]; 
}*pstu;
//后續(xù)間接
typedef struct student{
 char name[8];   
	int age;   
	char sex[2]; 
}stu;
stu *pstu;//定義了一個(gè)指針變量,它只能指向Student結(jié)構(gòu)體類(lèi)型的結(jié)構(gòu)體變量

如果想把已經(jīng)定義的結(jié)構(gòu)體變量交給一個(gè)指針,則必須用取址符&:

struct student{
 char name[8];   
	int age;   
	char sex[2]; 
}stu;
pstu =stu//錯(cuò)誤
pstu =&stu//正確

(這里要說(shuō)明的是,結(jié)構(gòu)體變量名稱(chēng)單獨(dú)拿出來(lái)代表變量全體成員值的集合,這與數(shù)組不同,數(shù)組名稱(chēng)在使用時(shí)直接轉(zhuǎn)化為該數(shù)組的起始地址)

2、通過(guò)結(jié)構(gòu)指針間接訪(fǎng)問(wèn)成員值:

(*結(jié)構(gòu)指針變量). 成員名

結(jié)構(gòu)指針變量 -> 成員名(我們管“->”叫做“箭頭”)

(*pstu).name;
//或
pstu->name;

注意(* pstu).name的小括號(hào)不能省略,成員符“.”優(yōu)先級(jí)最大,取值符“ *”優(yōu)先級(jí)在其次,去掉括號(hào)就相當(dāng)于 *(pstu.name)了。

總結(jié)

格式千千萬(wàn),只有全掌握才能閱讀別人的代碼,但在實(shí)際開(kāi)發(fā)中最推薦的格式依然是:

typedef struct student{   
	char name[8];   
	int age;   
	char sex[2];   
}xuesheng;

也不要忘了在整體賦值且在結(jié)構(gòu)體外賦值時(shí)的強(qiáng)制轉(zhuǎn)換。

如果有所收獲,點(diǎn)個(gè)贊唄~

最后:

#include<stdio.h>

int main(){
	printf("aiweiye forever.");
}

以上。

到此這篇關(guān)于C語(yǔ)言結(jié)構(gòu)體的文章就介紹到這了,更多相關(guān)C語(yǔ)言結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言簡(jiǎn)明講解變量的屬性

    C語(yǔ)言簡(jiǎn)明講解變量的屬性

    我們知道以在?C?語(yǔ)言中的變量有自己的屬性,只要在定義變量的時(shí)候加上“屬性”關(guān)鍵字即可。“屬性”關(guān)鍵字指明變量的特有意義,但是?register?關(guān)鍵字只是請(qǐng)求寄存器變量,所以不一定會(huì)成功
    2022-04-04
  • C語(yǔ)言使用openSSL庫(kù)AES模塊實(shí)現(xiàn)加密功能詳解

    C語(yǔ)言使用openSSL庫(kù)AES模塊實(shí)現(xiàn)加密功能詳解

    這篇文章主要介紹了C語(yǔ)言使用openSSL庫(kù)AES模塊實(shí)現(xiàn)加密功能,詳細(xì)分析了C語(yǔ)言加密的相關(guān)概念、原理及AES模塊加密具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法

    C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法

    本文主要介紹了C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C++調(diào)用Python基礎(chǔ)功能實(shí)例詳解

    C++調(diào)用Python基礎(chǔ)功能實(shí)例詳解

    c++調(diào)用Python首先安裝Python,本文以win7為例,給大家詳細(xì)介紹C++調(diào)用Python基礎(chǔ)功能,需要的朋友參考下吧
    2017-04-04
  • 詳解C++中的inline用法

    詳解C++中的inline用法

    在c/c++中,為了解決一些頻繁調(diào)用的小函數(shù)大量消耗??臻g(棧內(nèi)存)的問(wèn)題,特別的引入了inline修飾符,表示為內(nèi)聯(lián)函數(shù)。 ??臻g就是指放置程序的局部數(shù)據(jù)(也就是函數(shù)內(nèi)數(shù)據(jù))的內(nèi)存空間
    2017-09-09
  • VScode運(yùn)行C++中文終端亂碼的解決方案

    VScode運(yùn)行C++中文終端亂碼的解決方案

    這篇文章主要介紹了VScode運(yùn)行C++中文終端亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C++調(diào)用C函數(shù)報(bào)錯(cuò)無(wú)法解析的外部命令/無(wú)法解析的外部符號(hào)問(wèn)題

    C++調(diào)用C函數(shù)報(bào)錯(cuò)無(wú)法解析的外部命令/無(wú)法解析的外部符號(hào)問(wèn)題

    這篇文章主要介紹了C++調(diào)用C函數(shù)報(bào)錯(cuò)無(wú)法解析的外部命令/無(wú)法解析的外部符號(hào)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳解C語(yǔ)言中telldir()函數(shù)和seekdir()函數(shù)的用法

    詳解C語(yǔ)言中telldir()函數(shù)和seekdir()函數(shù)的用法

    這篇文章主要介紹了詳解C語(yǔ)言中telldir()函數(shù)和seekdir()函數(shù)的用法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++通過(guò)COM接口操作PPT

    C++通過(guò)COM接口操作PPT

    這篇文章主要為大家詳細(xì)介紹了C++通過(guò)COM接口操作PPT的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • C語(yǔ)言流程控制之switch語(yǔ)句詳解

    C語(yǔ)言流程控制之switch語(yǔ)句詳解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言流程控制之switch語(yǔ)句的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論