結構體
使用者自己建立由不同型別資料組成的組合型資料結構。
格式:
struct 結構體型別名{
資料型別1 成員1;
資料型別2 成員2;
資料型別3 成員3;
資料型別4 成員4;
......
資料型別n 成員n;
}
複製程式碼
struct Date
{
int year;
int month;
int day;
};
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
複製程式碼
說明:
由於客觀世界非常複雜,可以設計出許許多多結構體型別,例如:struct Teacher、struct Worker、struct Date等結構體型別;
各自包含不同的成員,應視具體情況而定;
成員可以屬於另一個結構體型別。
型別定義不分配記憶體,只是建立了一個結構體型別,它相當於一個模型,並沒有定義變數,其中並無具體資料,系統對它也不分配儲存單元;
若要在程式中使用結構體型別的資料,應當定義結構體型別的變數,並在其中存放具體的資料。
結構體變數
1、先宣告結構體型別,再定義該型別變數
例如:struct Student student1,student2;
//初始化結構體的變數
struct Student
{
char name[20];
int age;
};
void main(){
struct Student s = {"xiaoming",20};
printf("name:%s\n age:%d",s.name,s.age);
getchar();
}
複製程式碼
struct Student
{
char name[20];
int age;
};
void main(){
struct Student s;
s.age = 16;
strcpy(s.name,"xiaoming");
printf("name:%s\n age:%d",s.name,s.age);
getchar();
}
複製程式碼
2、在宣告型別的同時定義變數
struct 結構體名
{
成員表列
} 變數名錶列;
例如:
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
} student1, student2;
複製程式碼
說明:這種方式適用於小程式,對大型程式不適用,一般不採用。
struct Student
{
char name[20];
int age;
}s1, s2 = {"xiaoming",18};
void main(){
s1.age = 16;
strcpy(s1.name,"xiaofang");
printf("name:%s\n age:%d",s2.name,s2.age);
getchar();
}
複製程式碼
3、不指定結構體型別名而直接定義結構體型別變數(匿名結構體)。
由於未指定了的結構體名稱,只能定義一次該型別的變數,通常不採用這種方式。
struct
{
成員表列
}變數名錶列;
複製程式碼
struct
{
char name[20];
int age;
}s1;
void main(){
s1.age = 16;
strcpy(s1.name,"xiaofang");
printf("name:%s\n age:%d",s1.name,s1.age);
getchar();
}
複製程式碼
說明: 結構體型別與結構體變數是不同的概念,不要混同。只能對變數賦值、存取或運算,而不能對一個型別賦值、存取或運算。在編譯時,對型別是不分配空間的,只對變數分配空間;
結構體型別中的成員名可以與程式中的變數名相同,但二者不代表同一物件;
對結構體變數中的成員(即“域”),可以單獨使用,它的作用與地位相當於普通變數。
結構體巢狀
struct Teacher{
char name[20];
};
struct Student
{
char name[20];
int age;
struct Teacher t;
};
void main(){
struct Student s1 = { "xiaoming", 18, { "Jason" } };
printf("name:%s\n age:%d",s1.name,s1.age);
getchar();
}
複製程式碼
struct Teacher{
char name[20];
};
struct Student
{
char name[20];
int age;
struct Teacher t;
};
void main(){
struct Student s1;
s1.age = 18;
strcpy(s1.name,"xiaofang");
strcpy(s1.t.name, "MissLee");
printf("name:%s\n age:%d\n Teacher:%s",s1.name,s1.age,s1.t.name);
getchar();
}
複製程式碼
struct Student{
char name[20];
int age;
struct Teacher{
char name[20];
} t;
};
void main(){
struct Student s1;
s1.age = 18;
strcpy(s1.name,"xiaofang");
strcpy(s1.t.name, "MissLee");
printf("name:%s\n age:%d\n Teacher:%s",s1.name,s1.age,s1.t.name);
getchar();
}
複製程式碼
結構體與指標
struct Teacher{
char name[20];
};
struct Student{
char name[20];
int age;
};
void main(){
struct Student s1 = {"xiaoming",18};
struct Student* p = &s1;
printf("name:%s\n age:%d\n", s1.name, s1.age);
printf("name:%s\n age:%d\n", (*p).name, (*p).age);
//“->”(箭頭)是“(*p).”簡寫形式
printf("name:%s\n age:%d\n", p->name, p->age);
getchar();
}
複製程式碼
struct Student{
char name[20];
int age;
};
void main(){
struct Student s1;
s1.age = 18;
strcpy(s1.name,"xiaofang");
struct Student* p = &s1;
printf("name:%s\n age:%d\n",p->name,p->age);
getchar();
}
複製程式碼
結構體陣列和指標
概念:顧名思義是陣列中的每一個元素都是結構體變數
struct Student{
char name[20];
int age;
};
void main(){
struct Student s[] = { {"xiaoming",18}, {"xiaofang",17}, {"xiaoai",16} };
struct Student* p = s;
for (; p < s + 3; p++){
printf("name:%s\n age:%d\n", p->name, p->age);
}
printf("------------------------------------------\n");
int i = 0;
for (; i < sizeof(s) / sizeof(struct Student); i++){
printf("name:%s\n age:%d\n", s[i].name, s[i].age);
}
getchar();
}
複製程式碼
struct Student{
//char name[20];
int age;
double weight;
};
void main(){
struct Student s = { 18,90.00};
//結構體變數的大小,必須是最寬基本資料型別的整數倍
//提升讀取的效率
printf("%#x,%d\n", &s, sizeof(s));
getchar();
}
複製程式碼
結構體與動態記憶體分配
struct Student{
char name[20];
int age;
};
void main(){
struct Student *s = (struct Man*)malloc(sizeof(struct Student) * 10);
struct Student *p = s;
//賦值
p->age = 18;
strcpy(p->name,"xiaoming");
p++;
p->age = 16;
strcpy(p->name, "xiaofang");
struct Student *loop_p = s;
for (; loop_p < s + 2; loop_p++){
printf("%s,%d\n", loop_p->name, loop_p->age);
}
free(s);
getchar();
}
複製程式碼
結構體函式指標成員
//Student結構體類似於Java中的類,name和age類似於屬性,sayHi類似於方法
struct Student{
char* name;
int age;
void(*sayHi)(char*);
};
void sayHi(char* msg){
MessageBoxA(0, msg, "title", 0);
}
void main(){
struct Student s1;
s1.name = "xiaoming";
s1.age = 18;
s1.sayHi = sayHi;
printf("name:%s age:%d\n", s1.name, s1.age);
s1.sayHi("hello world");
getchar();
}
複製程式碼