天天看點

【C】 結構體與結構體指針,->在C語言中的唯一用途

/*	結構體
*/

#include <stdio.h>
#include <malloc.h>
#define STRLEN 128
struct Student
{
	char *name;			// 指針變量,指向字元,機器32位大小為32bit/8bit = 4Bytes
	int age;			// 整形變量,4位元組
	float score;		// 單精度浮點型,4位元組
};


int main(){
	int i = 0;
	struct Student stu;
	for (i = 0; i < 5; i++)
	{
		printf("輸入學生姓名:");
		stu.name = (char *)malloc(sizeof(char)*STRLEN);
		/*	很奇怪,上面為什麼要配置設定一塊記憶體空間呢?
			如果不配置設定記憶體,在運作的時候可能不會發生任何異常,因為恰好指針指向
			的記憶體是該指針有權限(讀和寫)的。
			如果運氣不好,指向了一塊隻讀的記憶體比如常量區或者代碼區,将引發緻命
			的崩潰!
			為了解決這個問題,那就在在使用這個指針之前,為其配置設定記憶體空間,使之
			指向一塊有意義的記憶體。
		*/
		scanf("%s", stu.name);

		printf("輸入學生年齡:");
		scanf("%d", &stu.age);

		printf("輸入學生分數:");
		scanf("%f", &stu.score);

		printf("學生%d\t 姓名(占記憶體%d):%s\t 年齡(占記憶體%d):%d\t 成績(占記憶體%d): %.2f\n", i, 
						sizeof(stu.name), stu.name, sizeof(stu.age), stu.age, sizeof(stu.score), stu.score);

		free(stu.name);
	}
	return 0;
}

/*	結構體指針
*/
#include <stdio.h>
#include <malloc.h>
#define STRLEN 128
struct Student
{
	char *name;			// 指針變量,指向字元,由于我的編譯環境是win32,是以一個指針變量的長度為32bit/8bit = 4Bytes
	int age;			// 整形變量,4位元組
	float score;		// 單精度浮點型,4位元組
}stu;


int main(){
	enum week{Mon=1, Tus=2, Wes=3, Thr=4, Fri=5, Sat=6, Sun=7};
	int day;
	scanf("%d",&day);
	switch (day)
	{
	case Mon:
		printf("星期一");
		break;
	case Tus:
		printf("星期二");
		break;
	case Wes:
		printf("星期三");
		break;
	default:
		break;
	}

	int i = 0;
	struct Student *p = &stu;
	for (i = 0; i < 5; i++)
	{
		printf("輸入學生姓名:");
		(*p).name = (char *)malloc(sizeof(char)*STRLEN);
		/*	很奇怪,上面為什麼要配置設定一塊記憶體空間呢?
			如果不配置設定記憶體,在運作的時候可能不會發生任何異常,因為恰好指針指向
			的記憶體是該指針有權限(讀和寫)的。
			如果運氣不好,指向了一塊隻讀的記憶體比如常量區或者代碼區,将引發緻命
			的崩潰!
			為了解決這個問題,那就在在使用這個指針之前,為其配置設定記憶體空間,使之
			指向一塊有意義的記憶體。
		*/
		scanf("%s", (*p).name);
		scanf("%s", p->name);

		printf("輸入學生年齡:");
		scanf("%d", &((*p).age));
		scanf("%d", &p->age);


		printf("輸入學生分數:");
		scanf("%f", &((*p).score));
		scanf("%f", &p->score);


		printf("學生%d\t 姓名(占記憶體%d):%s\t 年齡(占記憶體%d):%d\t 成績(占記憶體%d): %.2f\n", i, 
						sizeof((*p).name), (*p).name, sizeof((*p).age), (*p).age, sizeof((*p).score), (*p).score);
		printf("學生%d\t 姓名(占記憶體%d):%s\t 年齡(占記憶體%d):%d\t 成績(占記憶體%d): %.2f\n", i, 
						sizeof(p->name), p->name, sizeof(p->age), p->age, sizeof(p->score), p->score);

		free(p->name);
	}
	return 0;
}