- 如果有typedef 定义结构体,那么后面跟着的单词是类型的别名
typedef struct Person { char name[64]; int age; //不要在定义结构体时候赋初值 } myPerson;//myPerson是struct Person 类型的别名 void test01() { myPerson p = { "aa", 10 }; }
- 没有typedef,定义结构体,后面跟着的单词是一个结构体变量
struct Person2 { char name[64]; int age; } myPerson2 = {"bbb" , 200}; //myPerson是一个结构体变量 void test02() { printf("姓名: %s 年龄: %d\n", myPerson2.name, myPerson2.age); myPerson2.age = 100; strcpy(myPerson2.name, "aaa"); printf("姓名: %s 年龄: %d\n", myPerson2.name, myPerson2.age); }
//匿名类型,后期无法使用 struct { char name[64]; int age; }myPerson3 = {"ccc" , 30}; void test03() { printf("姓名: %s 年龄: %d\n", myPerson3.name, myPerson3.age); }
- 结构体数组
- 在栈上开辟
- 在堆区开辟
void test04()
{
//在栈上创建结构体变量
struct Person p1 = { "aaa", 10 };
//在堆区创建结构体变量
struct Person *p2 = malloc(sizeof(struct Person));
p2->age = 100;
strcpy(p2->name, "bbb");
}
void printArray( struct Person persons[] , int len)
{
for (int i = 0; i < len;i++)
{
printf("姓名:%s 年龄 %d\n", persons[i].name, persons[i].age);
}
}
void test05()
{
//结构体变量数组
//在栈上创建
struct Person persons[] =
{
{ "aaa", 10 },
{ "bbb", 20 },
{ "ccc", 30 },
{ "ddd", 40 },
};
/*int len = sizeof(persons) / sizeof(struct Person);
printArray(persons, len);*/
//在堆区创建
struct Person * personArr = malloc(sizeof(struct Person) * 4);
for (int i = 0; i < 4;i++)
{
sprintf(personArr[i].name, "name_%d", i);
personArr[i].age = i + 18;
}
printArray(personArr, 4);
if (personArr != NULL)
{
free(personArr);
personArr = NULL;
}
}