c學習筆記:結構體(結構體數組、結構體嵌套結構體、結構體指針變量、堆區的結構體數組、共用體)

目錄

知識點1【結構體】

知識點2【結構體數組】

知識點3【結構體嵌套結構體】

知識點4【結構體指針變量】

知識點5【堆區的結構體數組】

知識點6【結構體指針變量作爲函數參數】

知識點7【結構體數組名作爲函數的參數】

知識點8【指針變量作爲函數的成員】

知識點9【const修飾結構體指針變量】

知識點10【共用體】


 

知識點1【結構體】

結構體中的成員空間是獨立的
3種方式定義:

 

知識點2【結構體數組】

struct stu
{
	int num;
	char name[16];
	int age;
};

void test()
{
	struct stu arr[5] = { {10,"lucy",18},{11,"bob",20},{12,"tom",20} };
	int n = sizeof(arr) / sizeof(arr[0]);
	for (size_t i = 0; i < n; i++)
	{
		printf("%d %s %d\n", arr[i].num, arr[i].name, arr[i].age);
	}
}

 

知識點3【結構體嵌套結構體】

 

知識點4【結構體指針變量】

struct stu
{
	int num;
	char name[16];
	float age;
};

void test()
{
	struct stu lucy = { 100,"lucy",99.9f };
	struct stu *p = NULL;
	p = &lucy;
	printf("num=%d, name=%s age=%f\n", lucy.num, lucy.name, lucy.age);
	printf("num=%d, name=%s age=%f\n", (*p).num,(*p).name,(*p).age);
	printf("num=%d, name=%s age=%f\n", p->num, p->name, p->age);
	printf("num=%d, name=%s age=%f\n", (&lucy)->num, (&lucy)->name, (&lucy)->age);
}

 

知識點5【堆區的結構體數組】

struct stu
{
	int num;
	char name[16];
	float score;
};

void test()
{
	int n = 0;
	printf("請輸入學生的個數:");
	scanf("%d", &n);

	//根據學生個數申請空間
	struct stu *arr = NULL;
	arr = (struct stu *)malloc(n * sizeof(struct stu));
	memset(arr, 0, n * sizeof(struct stu));

	//結構體成員賦值
	for (size_t i = 0; i < n; i++)
	{
		printf("請輸入第%d學生的信息:", i + 1);
		scanf("%d %s %f", &arr[i].num, arr[i].name, &arr[i].score);
		//scanf("%d %s %f", &(*(arr + i)).num, (*(arr + i)).name, &(*(arr + i)).score);
		//scanf("%d %s %f", &(arr+i)->num, (arr+i)->name, (arr+i)->score);
	}

	for (size_t i = 0; i < n; i++)
	{
		printf("num=%d, name=%s, score=%f\n", (arr+i)->num,(arr+i)->name,(arr+i)->score);
	}
	if (arr != NULL)
	{
		free(arr);
		arr = NULL;
	}
}

 

知識點6【結構體指針變量作爲函數參數】

改變結構體的值

 

知識點7【結構體數組名作爲函數的參數】
 

struct stu
{
	int num;
	char name[16];
	float score;
};

void myinputstuarray(struct stu *arr, int n)
//void myInputStuArray(struct stu arr[5], int n)
//void myInputStuArray(struct stu arr[], int n)
{
	printf("請輸入%d個學生的信息:\n", n);
	for (size_t i = 0; i < n; i++)
	{
		scanf("%d %s %f", &(arr + i)->num, (arr + i)->name, &(arr + i)->score);
	}
}

void myprintstuarray(struct stu *arr, int n)
{
	printf("---------------------------\n");
	for (size_t i = 0; i < n; i++)
	{
		printf("num=%d,name=%s,score=%f\n", (arr + i)->num, (arr + i)->name, (arr + i)->score);
		//printf("num=%d, name=%s, score=%f\n", arr[i].num, arr[i].name, arr[i].score);
	}
}
void test()
{
	struct stu edu[5];
	menset(edu, 0, sizeof(edu));
	int n = sizeof(edu) / sizeof(edu[0]);
	myinptstuarray(edu, n);
	myprintstuarray(edu, n);

}

 

知識點8【指針變量作爲函數的成員】

知識點9【const修飾結構體指針變量】

 void test04()
 {
 struct stu lucy = { 10, "lucy", 20 };
struct stu bob = {20, "bob", 21};

//const在*的左邊:(*p只讀 p可讀可寫)(不能通過p對結構體成員寫操作 p可以指向其他結構體的地址)
const struct stu * p = &lucy;
//p->num = 100;//err
//(*p).num = 100;//err
p = &bob;

//const 在*的右邊:(*p1可讀可寫 p1只讀)(可以通過p1對結構體成員寫操作 p1不可以指向其他結構體的地
址)
struct stu * const p1 = &lucy;
p1->num = 100;
(*p1).num = 100;
printf("num = %d\n", p1->num);
//p1 = &bob;//err

//const在*的左右兩邊(*p2只讀 p2只讀)(不能通過p2對結構體成員寫操作 p2不可以指向其他結構體的地址)
const struct stu * const p2 = &lucy;
//p2->num = 200;//err
//p2 = &bob;//err
 }

知識點10【共用體】

結構體:成員擁有獨立的空間 共用體:成員共享同一塊空間

案例:共用體中的成員雖然公用同一段空間 但是 成員能使用空間的大小由成員自身類型決定。

原理分析:

案例2:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章