目錄
知識點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: