大家好,我是澤奀,本篇博客就帶大家來(初始)C語言的結構體的內容,后面也會發布一篇進階的內容,如果覺得有幫助到你的話,別忘記給博主來個大大的點贊👍,非常感謝,
目錄
結構體基礎:
typedef作用:
結構體的作用:
結構體的大小與記憶體對齊:
結構體成員的型別
結構體成員
結構體(套娃‘doge’)
結構體傳參和傳值
1.傳參
2.傳址
各位,這兩個函式如果要選擇一個的話,選擇第2個,因為:
結構體基礎:
結構是一些值的集合,這些值被稱作是成員之間的變數,結構體 每個成員可以是不同型別變數,
好,那我就先舉個代碼例子,讓大家更容易去了解什么是結構體:
#include<stdio.h>
//描述一個學生
typedef struct student
{
char name[20];//學生名字
char sex[5];//學生性別
char id[20];//學生學號
short int age;//學生年齡
}student;//注意:對結構體型別進行重命名
int main(void)
{
student mation = { "小明", "男", "123456789", 18 };//typedef命名的新名字student
printf("%s\n", mation.name);
printf("%s\n", mation.sex);
printf("%s\n", mation.id);
printf("%d\n", mation.age);
return 0;
}
- struct — 結構體的關鍵字,
- student — 結構體的標簽,可以隨意的替換看你指向的物件是誰了,
- struct student —— 叫做結構體型別,
- 大括號 { } 里面的內容被稱作是:成員變數, 注意大括號后面必須要有分號,可以加成員串列,分號前面內容,可以是全域的結構體變數(一般都不會去使用),在代碼中我們要盡可能的去少的使用全域變數,
- 在函式中 mation —— 結構體型別的變數,當然這里我直接 student mation;是可以的,因為我用了typedef關鍵字,當然這個是可以隨意定義結構體標簽新的名字,不過我喜歡直接去定義結構體標簽,
- 結構體型別的變數(mation)需要存放結構體型別的成員變數,所以我們可以要給上一個大括號直接去接收這些結構體變數,到了這一步,我們的結構體型別的初始化已經🆗了,注意:結構體型別的成員變數的資料型別使用不要弄錯了以及主函式當中的列印的占位符記得要和全域變數一一對應才行,
- 最后,就是列印了,這里說下xxx.xxx在這個解釋下什么意思:xxx.這個是結構體標簽,通過這個后面的xxx是結構體當中型別的成員變數,也就是找到那個成員,
以上我講的這一步驟,是定義:結構體的型別,那么在這里細心的朋友已經發現了,代碼中結構體型別前面還加了一個typedef,那在這里我跟大家說下:typedef把結構體型別給重新的起了一個名字,在主函式中大家就可以知道,而,分號前我也寫了注釋,
typedef作用:
想了想,還是把typedef單獨拿出來說一說吧
C 語言提供了 typedef 關鍵字,你可以使用它來為型別取一個新的名字,
typedef struct Books == Book book 就像這樣.
看到這里可能有些人會感覺和#deifne怎么感覺一樣,那在這里我說下:
#define 是 C 指令,用于為各種資料型別定義別名,與 typedef 類似,但是它們有以下幾點不同:
typedef 僅限于為型別定義符號名稱,#define 不僅可以為型別定義別名,也能為數值定義別名,比如您可以定義 1 為 ONE,
typedef 是由編譯器執行解釋的,#define 陳述句是由預編譯器進行處理的,
結構體的作用:
結構體和其他型別基礎資料型別一樣,例如 int 型別,char 型別 只不過結構體可以做成你想要的資料型別,以方便日后的使用,
在實際專案中,結構體是大量存在的,研發人員常使用結構體來封裝一些屬性來組成新的型別,
結構體在函式中的作用不是簡便,其最主要的作用就是封裝,封裝的好處就是可以再次利用,讓使用者不必關心這個是什么,只要根據定義使用就可以了,
結構體的大小與記憶體對齊:
結構體的大小不是結構體元素單純相加就行的,因為我們現在主流的計算機使用的都是 32Bit 字長的 CPU,對這型別的 CPU 取 4 個位元組的數要比取一個位元組要高效,也更方便,所以在結構體中每個成員的首地址都是4的整數倍的話,取資料元素是就會相對更高效,這就是記憶體對齊的由來,
結構體成員的型別
結構體成員的型別,可以是變數,陣列,指標,甚至是其它的結構體,這里就不每個去列舉了,
結構體成員
- 結構體變數的訪問成員,是通過運算子(.)訪問的,
結構體(套娃‘doge’)
在結構體成員型別中我說了下,但有些小伙伴可能會有點不清楚,在這里我把代碼給大家,注意: 在上面結構體我使用了紅色字體所標注的.
#include<stdio.h>
//學生家地址
struct address
{
char T [20];
};
//描述一個學生
typedef struct student //typedef —— 可以使用它來為型別取一個新的名字
{
char name[20]; //學生名字
char sex[5]; //學生性別
char id[20]; //學生學號
short int age; //學生年齡
struct address S;
}student; //注意:對結構體型別進行重命名
int main(void)
{
// struct student mation;// mation —— 結構體型別的變數
student mation = { "法外狂徒張三", "man", "10086", 18, {"康達小區三懂一單元"} };
printf("%s\n", mation.name);
printf("%s\n", mation.sex);
printf("%s\n", mation.id);
printf("%d\n", mation.age);
printf("%s\n", mation.S.T);//注意,由于我們是把一個結構體型別放在另一個結構體,所以這里需要找兩次,
return 0;
}
結構體傳參和傳值
1.傳參
注意,在print函式當中記得定義結構體關鍵字,
#include<stdio.h>
//描述一個學生
typedef struct student //typedef —— 可以使用它來為型別取一個新的名字
{
char name[20]; //學生名字
char sex[5]; //學生性別
char id[20]; //學生學號
short int age; //學生年齡
}student; //注意:對結構體型別進行重命名
void print(student tmp)
{
printf("%s\n", tmp.name);
printf("%s\n", tmp.sex);
printf("%s\n", tmp.id);
printf("%d\n", tmp.age);
}
int main(void)
{
// struct student mation;// mation —— 結構體型別的變數
student mation = { "法外狂徒張三", "man", "10086", 18 };
//實作傳參
print(mation);
return 0;
}
2.傳址
注意:print2函式中列印的,-> (運算子),在這里tmp2指標箭頭指向物件的內容,
#include<stdio.h>
//描述一個學生
typedef struct student //typedef —— 可以使用它來為型別取一個新的名字
{
char name[20]; //學生名字
char sex[5]; //學生性別
char id[20]; //學生學號
short int age; //學生年齡
}student; //注意:對結構體型別進行重命名
void print2(student *tmp)
{
printf("%s\n", tmp->name);
printf("%s\n", tmp->sex);
printf("%s\n", tmp->id);
printf("%d\n", tmp->age);
}
int main(void)
{
// struct student mation;// mation —— 結構體型別的變數
student mation = { "法外狂徒張三", "man", "10086", 18 };
//實作傳址
print2(&mation);
return 0;
}
各位,這兩個函式如果要選擇一個的話,選擇第2個,因為:
- 傳參:如果當我們用實參傳遞給形參的話,其實就是一份臨時拷貝,這樣的話就要把所有的資料記憶體空間給再copy一份下去,放在其它的記憶體上,在這里我取名為tmp,就很簡單就是例如,是200個位元組那么你傳的引數就也要兩百個位元組,這就會導致空間的一個浪費就會非常嚴重滴,同時你copy過去還需要一定的時間,
- 傳址:這里我傳過去的僅僅是地址(&),一個地址就是4位元組(32位)8個位元組(64位),注意這里是int型別的資料型別所以是4個位元組以及32個位元位,用三十二位的二進制來進行表達,
如果要選擇一種,我們盡可能的去選擇傳址,因為效率更高些,而且還可以省出一定記憶體空間,尤其是對大型專案的看法,兩種我們就可以去選擇傳址,
結論:當結構體傳參的時候要傳入結構體的地址,
好,那么本篇博客就帶大家如何去學習結構體初始了,那么覺得本篇博客對你起到幫助的話,記得給博主一個點贊,當然能三連我會更開心的,其實寫博客也算是對以前的知識點的一個總結吧,加油,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298364.html
標籤:其他
