C語言(結構體)

鋸齒流沙發表於2017-12-13

結構體

使用者自己建立由不同型別資料組成的組合型資料結構。

格式:

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();
}
複製程式碼

執行結果.png

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();
}
複製程式碼

執行結果.png

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();
}
複製程式碼

執行結果.png

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();
}

複製程式碼

C語言(結構體)

說明: 結構體型別與結構體變數是不同的概念,不要混同。只能對變數賦值、存取或運算,而不能對一個型別賦值、存取或運算。在編譯時,對型別是不分配空間的,只對變數分配空間;

結構體型別中的成員名可以與程式中的變數名相同,但二者不代表同一物件;

對結構體變數中的成員(即“域”),可以單獨使用,它的作用與地位相當於普通變數。

結構體巢狀

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();
}
複製程式碼

執行結果.png

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();
}

複製程式碼

執行結果.png

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();
}
複製程式碼

執行結果.png

結構體與指標

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();
}

複製程式碼

執行結果.png

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();
}
複製程式碼

執行結果.png

結構體陣列和指標

概念:顧名思義是陣列中的每一個元素都是結構體變數

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();
}

複製程式碼

執行結果.png

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();
}
複製程式碼

執行結果.png

結構體與動態記憶體分配

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();
}
複製程式碼

執行結果.png

結構體函式指標成員

//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();
}

複製程式碼

執行結果.png

相關文章