怎么通過建站來賺錢西安網(wǎng)站維護(hù)公司
目錄
1.結(jié)構(gòu)體(struct)類型?
2.結(jié)構(gòu)標(biāo)記?
3.typedef
4.定義結(jié)構(gòu)數(shù)組的方法?
5.調(diào)用結(jié)構(gòu)數(shù)組的方法?
6.將結(jié)構(gòu)體傳入函數(shù)
7.結(jié)構(gòu)體使用實(shí)例
1.結(jié)構(gòu)體(struct)類型?
在C語言中,結(jié)構(gòu)體(struct)類型是一種用戶自定義的復(fù)合數(shù)據(jù)類型,用于組合不同類型的數(shù)據(jù)成員在一個(gè)單獨(dú)的對(duì)象中。結(jié)構(gòu)體類型的定義可以包含多個(gè)數(shù)據(jù)成員,每個(gè)數(shù)據(jù)成員可以是不同的數(shù)據(jù)類型。結(jié)構(gòu)體類型的語法如下:
struct 結(jié)構(gòu)體名 {數(shù)據(jù)類型 成員名1;數(shù)據(jù)類型 成員名2;// ...
};
以下是一個(gè)示例:
struct student {int id;char name[20];int age;float score;
};
上述代碼定義了一個(gè)名為student
的結(jié)構(gòu)體類型,包含了四個(gè)數(shù)據(jù)成員:id
、name
、age
和score
,分別為整型、字符數(shù)組型、整型和浮點(diǎn)型。該結(jié)構(gòu)體類型可以用于定義表示學(xué)生的對(duì)象,每個(gè)對(duì)象包括了學(xué)生的ID、姓名、年齡和分?jǐn)?shù)。結(jié)構(gòu)體類型創(chuàng)建后,需要通過聲明一個(gè)結(jié)構(gòu)體變量來實(shí)際分配內(nèi)存,例如:
struct student s; // 聲明一個(gè)名為s的結(jié)構(gòu)體變量,表示一個(gè)學(xué)生
s.id = 1001; // 設(shè)置學(xué)生的ID為1001
strncpy(s.name, "Tom", sizeof(s.name)); // 設(shè)置學(xué)生的姓名為Tom
s.age = 20; // 設(shè)置學(xué)生的年紀(jì)為20
s.score = 90.5; // 設(shè)置學(xué)生的分?jǐn)?shù)為90.5
2.結(jié)構(gòu)標(biāo)記?
C語言中,結(jié)構(gòu)標(biāo)記指的是定義一個(gè)結(jié)構(gòu)體類型的名稱,而不是直接定義結(jié)構(gòu)體變量。結(jié)構(gòu)標(biāo)記的聲明格式如下:
struct 結(jié)構(gòu)體名稱;
例如,以下是一個(gè)結(jié)構(gòu)標(biāo)記的聲明:
struct student;
這個(gè)聲明定義了一個(gè)名為"student"的結(jié)構(gòu)體類型,但沒有定義具體的結(jié)構(gòu)體成員。這是因?yàn)榻Y(jié)構(gòu)標(biāo)記只是為結(jié)構(gòu)體類型分配了一個(gè)名稱,而沒有為它分配內(nèi)存空間。
結(jié)構(gòu)標(biāo)記的主要作用是方便在后面的代碼中使用結(jié)構(gòu)體類型??梢允褂媒Y(jié)構(gòu)標(biāo)記名稱來聲明結(jié)構(gòu)體變量、作為函數(shù)參數(shù)類型以及作為函數(shù)返回類型等。
3.typedef
C語言中,typedef是一種定義類型別名的關(guān)鍵字。它的用法如下:
- 聲明簡單類型別名
typedef 原類型別名 新類型別名;
例如:
typedef int INT;
INT a = 1;
這樣將int
類型的a
定義為INT
類型的變量。
- 聲明結(jié)構(gòu)體類型別名
typedef struct 原類型別名 新類型別名;
例如:
typedef struct date {int year;int month;int day;
} DATE;
DATE d = {2021, 10, 1};
這樣將struct date
類型的d
定義為DATE
類型的變量。
- 聲明指針類型別名
typedef 原類型別名 * 新類型別名;
例如:
typedef int * PTR_INT;
int i = 1;
PTR_INT ptr_i;
ptr_i = &i;
這樣將int
類型的指針定義為PTR_INT
類型的指針變量。
使用typedef可以使代碼更加簡潔易懂,提高代碼的可讀性。
4.定義結(jié)構(gòu)數(shù)組的方法?
定義結(jié)構(gòu)數(shù)組的方法如下:
struct student {char name[20];int age;char gender;
};struct student stu[3]; // 定義一個(gè)包含3個(gè)元素的結(jié)構(gòu)數(shù)組
這里定義了一個(gè)結(jié)構(gòu)體 student
,包含了學(xué)生的姓名、年齡和性別,然后通過結(jié)構(gòu)體定義一個(gè)包含3個(gè)元素的結(jié)構(gòu)數(shù)組 stu
。
5.調(diào)用結(jié)構(gòu)數(shù)組的方法?
調(diào)用結(jié)構(gòu)數(shù)組的方法如下:
#include <stdio.h>int main() {struct student stu[3] = {{"Tom", 18, 'M'},{"Lucy", 19, 'F'},{"John", 20, 'M'}};for(int i = 0; i < 3; i++) {printf("Name: %s\n", stu[i].name);printf("Age: %d\n", stu[i].age);printf("Gender: %c\n", stu[i].gender);}return 0;
}
這里通過初始化方式給結(jié)構(gòu)數(shù)組賦值,然后使用 for
循環(huán)輸出每個(gè)學(xué)生的信息。在輸出時(shí)使用了結(jié)構(gòu)體成員連接運(yùn)算符 .(點(diǎn)號(hào))
來訪問每個(gè)學(xué)生的姓名、年齡和性別。
C語言中的結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,可以包含多個(gè)不同類型的數(shù)據(jù)成員。結(jié)構(gòu)體的定義可以在函數(shù)內(nèi)部或外部,格式為:
struct 結(jié)構(gòu)體名 {數(shù)據(jù)類型 成員名1;數(shù)據(jù)類型 成員名2;...
};
其中,結(jié)構(gòu)體名是自己定義的,可以起任何名字。成員名也可以任意取名,但要符合C語言的命名規(guī)則。
結(jié)構(gòu)體變量定義格式為:
struct 結(jié)構(gòu)體名 變量名;
訪問結(jié)構(gòu)體成員時(shí)使用“.”操作符,格式為:
變量名.成員名
例如:
struct student {char name[20];int age;float score;
};int main() {struct student s1;strcpy(s1.name, "Tom");s1.age = 18;s1.score = 88.5;printf("%s's age is %d, score is %.1f\n", s1.name, s1.age, s1.score);return 0;
}
輸出結(jié)果為:
Tom's age is 18, score is 88.5
?
6.將結(jié)構(gòu)體傳入函數(shù)
結(jié)構(gòu)體可以像其他數(shù)據(jù)類型一樣傳遞給函數(shù)。下面是一些示例代碼:
假設(shè)有以下結(jié)構(gòu)體:
typedef struct Person {char name[30];int age;
} Person;
- 將結(jié)構(gòu)體作為函數(shù)參數(shù)
將結(jié)構(gòu)體作為函數(shù)的參數(shù),可以通過值傳遞或指針傳遞。
void print_person(Person p) {printf("姓名:%s,年齡:%d\n", p.name, p.age);
}void update_person(Person *p) {p->age += 1;
}
在這個(gè)示例代碼中,我們定義了兩個(gè)函數(shù)。print_person函數(shù)用于打印結(jié)構(gòu)體Person中的信息,update_person函數(shù)用于修改結(jié)構(gòu)體Person中的信息。print_person函數(shù)使用的是值傳遞,即將結(jié)構(gòu)體Person的值作為參數(shù)傳遞給函數(shù)。update_person函數(shù)使用的是指針傳遞,即將結(jié)構(gòu)體Person的指針作為參數(shù)傳遞給函數(shù)。
- 將結(jié)構(gòu)體指針作為函數(shù)參數(shù)
如果要在函數(shù)中修改結(jié)構(gòu)體的值,可以將結(jié)構(gòu)體的指針作為參數(shù)傳遞給函數(shù)。這樣可以避免在函數(shù)內(nèi)部創(chuàng)建新的結(jié)構(gòu)體副本。
void update_person(Person *p) {p->age += 1;
}
在此示例代碼中,我們定義了一個(gè)update_person函數(shù),它使用了指針傳遞。函數(shù)使用->運(yùn)算符來訪問結(jié)構(gòu)體中的成員。
調(diào)用上述函數(shù)的方法如下:
Person person = {"Tom", 20};
print_person(person); // 輸出 "姓名:Tom,年齡:20"
update_person(&person);
print_person(person); // 輸出 "姓名:Tom,年齡:21"
7.結(jié)構(gòu)體使用實(shí)例
利用結(jié)構(gòu)體求投票數(shù)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_CANDIDATES 10// 候選人結(jié)構(gòu)體
typedef struct Candidate {char name[50]; // 候選人名字int vote_count; // 票數(shù)
} Candidate;int main() {int num_candidates;Candidate candidates[MAX_CANDIDATES];// 獲取候選人數(shù)量printf("請(qǐng)輸入候選人數(shù)量(最多%d個(gè)):", MAX_CANDIDATES);scanf("%d", &num_candidates);getchar(); // 消耗輸入緩沖區(qū)中的換行符// 獲取候選人信息for (int i = 0; i < num_candidates; i++) {printf("請(qǐng)輸入候選人%d的名字:", i+1);fgets(candidates[i].name, 50, stdin);candidates[i].name[strcspn(candidates[i].name, "\n")] = '\0'; // 去除輸入緩沖區(qū)中的換行符candidates[i].vote_count = 0; // 初始化票數(shù)為0}// 投票while (1) {char candidate_name[50];printf("請(qǐng)輸入你要投票的候選人名字(輸入exit結(jié)束投票):");fgets(candidate_name, 50, stdin);candidate_name[strcspn(candidate_name, "\n")] = '\0';if (strcmp(candidate_name, "exit") == 0) {break;}int found = 0;for (int i = 0; i < num_candidates; i++) {if (strcmp(candidate_name, candidates[i].name) == 0) {candidates[i].vote_count++;found = 1;break;}}if (!found) {printf("沒有找到名為%s的候選人,請(qǐng)重新輸入。\n", candidate_name);}}// 輸出投票結(jié)果printf("投票結(jié)果:\n");for (int i = 0; i < num_candidates; i++) {printf("%s: %d 票\n", candidates[i].name, candidates[i].vote_count);}return 0;
}
在這個(gè)例子中,我們定義了一個(gè)候選人結(jié)構(gòu)體,包含了候選人的名字和票數(shù)。在程序運(yùn)行時(shí),首先獲取候選人數(shù)量和候選人信息,并初始化各個(gè)候選人的票數(shù)為0。然后,利用一個(gè)循環(huán)獲取用戶輸入的投票信息,直到用戶輸入exit為止。每次獲取到用戶輸入的候選人名字后,我們遍歷候選人數(shù)組,查找是否有對(duì)應(yīng)的候選人。如果找到了,則給該候選人的票數(shù)加1;否則輸出錯(cuò)誤提示信息。最后,我們輸出投票結(jié)果,顯示每個(gè)候選人的名字和票數(shù)。
?