C語言 結(jié)構(gòu)體
- 結(jié)構(gòu)體的概念
- 在C語言中,結(jié)構(gòu)體(struct)是一種用戶自定義的數(shù)據(jù)類型,用于將不同類型的數(shù)據(jù)組合在一起,形成一個(gè)邏輯上相關(guān)的整體。它類似于一個(gè)容器,可以容納多種不同類型的數(shù)據(jù)項(xiàng)。
- 結(jié)構(gòu)體的定義
- 結(jié)構(gòu)體的定義語法如下:
例如,定義一個(gè)表示學(xué)生信息的結(jié)構(gòu)體:struct 結(jié)構(gòu)體名 { 成員類型1 成員名1; 成員類型2 成員名2; //... 成員類型n 成員名n; };struct Student { char name[20]; int age; float score; }; - 這里定義了一個(gè)名為
Student的結(jié)構(gòu)體,它包含三個(gè)成員:一個(gè)字符數(shù)組name用于存儲(chǔ)學(xué)生姓名,一個(gè)整數(shù)age用于存儲(chǔ)學(xué)生年齡,一個(gè)浮點(diǎn)數(shù)score用于存儲(chǔ)學(xué)生成績。
- 結(jié)構(gòu)體的定義語法如下:
- 結(jié)構(gòu)體變量的聲明與初始化
- 聲明
- 可以在結(jié)構(gòu)體定義之后聲明結(jié)構(gòu)體變量。例如:
struct Student stu1; - 也可以在定義結(jié)構(gòu)體的同時(shí)聲明結(jié)構(gòu)體變量:
struct Student { char name[20]; int age; float score; } stu2;
- 可以在結(jié)構(gòu)體定義之后聲明結(jié)構(gòu)體變量。例如:
- 初始化
- 結(jié)構(gòu)體變量可以在聲明時(shí)進(jìn)行初始化。例如:
struct Student stu3 = {"Tom", 18, 90.5}; - 還可以通過指定成員來初始化:
struct Student stu4 = {.age = 19,.score = 88.0,.name = "Jerry"};
- 結(jié)構(gòu)體變量可以在聲明時(shí)進(jìn)行初始化。例如:
- 聲明
- 結(jié)構(gòu)體成員的訪問
- 使用點(diǎn)(
.)運(yùn)算符來訪問結(jié)構(gòu)體變量的成員。例如:struct Student stu = {"Alice", 20, 95.0}; printf("Name: %s, Age: %d, Score: %f\n", stu.name, stu.age, stu.score); - 如果是指向結(jié)構(gòu)體的指針,則使用箭頭(
->)運(yùn)算符來訪問成員。例如:struct Student *pStu = &stu; printf("Name: %s, Age: %d, Score: %f\n", pStu->name, pStu->age, pStu->score);
- 使用點(diǎn)(
- 結(jié)構(gòu)體的嵌套
- 結(jié)構(gòu)體中可以嵌套其他結(jié)構(gòu)體。例如:
要訪問嵌套結(jié)構(gòu)體中的成員,可以使用多級(jí)點(diǎn)運(yùn)算符或者箭頭運(yùn)算符(如果是指針的話)。例如:struct Date { int year; int month; int day; }; struct Student { char name[20]; int age; struct Date birthday; float score; };struct Student stu = {"Bob", 21, {2000, 5, 10}, 92.0}; printf("Birthday: %d - %d - %d\n", stu.birthday.year, stu.birthday.month, stu.birthday.day);
- 結(jié)構(gòu)體中可以嵌套其他結(jié)構(gòu)體。例如:
- 結(jié)構(gòu)體數(shù)組
- 可以定義結(jié)構(gòu)體數(shù)組,它是一組具有相同結(jié)構(gòu)體類型的元素。例如:
初始化結(jié)構(gòu)體數(shù)組的方法如下:struct Student students[3];
訪問結(jié)構(gòu)體數(shù)組元素的成員與訪問單個(gè)結(jié)構(gòu)體變量的成員類似。例如:struct Student students[3] = {{"Mike", 18, 85.0}, {"John", 19, 90.0}, {"Lily", 20, 92.0}};for (int i = 0; i < 3; i++) { printf("Student %d: Name: %s, Age: %d, Score: %f\n", i + 1, students[i].name, students[i].age, students[i].score); }
- 可以定義結(jié)構(gòu)體數(shù)組,它是一組具有相同結(jié)構(gòu)體類型的元素。例如:
- 結(jié)構(gòu)體在函數(shù)中的使用
- 結(jié)構(gòu)體可以作為函數(shù)的參數(shù)傳遞,也可以作為函數(shù)的返回值。
- 結(jié)構(gòu)體作為參數(shù)傳遞
- 當(dāng)結(jié)構(gòu)體作為參數(shù)傳遞給函數(shù)時(shí),默認(rèn)是按值傳遞,這意味著整個(gè)結(jié)構(gòu)體內(nèi)容會(huì)被復(fù)制一份傳遞給函數(shù)。例如:
void printStudent(struct Student stu) { printf("Name: %s, Age: %d, Score: %f\n", stu.name, stu.age, stu.score); } - 如果結(jié)構(gòu)體較大,按值傳遞可能會(huì)導(dǎo)致效率低下,可以使用指針傳遞來提高效率。例如:
void modifyStudent(struct Student *pStu) { pStu->age++; }
- 當(dāng)結(jié)構(gòu)體作為參數(shù)傳遞給函數(shù)時(shí),默認(rèn)是按值傳遞,這意味著整個(gè)結(jié)構(gòu)體內(nèi)容會(huì)被復(fù)制一份傳遞給函數(shù)。例如:
- 結(jié)構(gòu)體作為返回值
- 函數(shù)也可以返回結(jié)構(gòu)體。例如:
struct Student createStudent() { struct Student newStu = {"New Student", 18, 88.0}; return newStu; }
- 函數(shù)也可以返回結(jié)構(gòu)體。例如:
結(jié)構(gòu)體在C語言中是一種非常有用的數(shù)據(jù)組織工具,可以方便地處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu),提高代碼的模塊化和可讀性。

浙公網(wǎng)安備 33010602011771號(hào)