目录
知识点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: