🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] 字符串拷贝用strcpy,字符用=就可以了,因为=拷贝字符串时候只会拷贝首地址(第一个字符),而strcpy是把字符串里每个字符一个一个拷贝过去 结构体名字用. 结构体指针用-> # 定义 ~~~ struct students { //成员列表 char name[21]; unsigned int age; char tel[16]; float scores[3]; char sex; }stu = {"尼古拉斯", 500, "15557105721", 100.0f, 200, 300, 'M'}; int main() { //按照结构体顺序赋值 // struct students stu = {"尼古拉斯", 500, "15557105721", 100.0f, 200, 300, 'M'}; //每个属性赋值 // struct students stu = {.sex = 'M', .name = "刘能", .tel = "15557105722", .scores[0] = 100, .scores[1] = 11, .scores[2] = 33, .age = 12}; //起别名赋值 // struct students stu; // //字符串需要拷贝进去,因为需要的是个数组,给字符串的话,就把地址给过去了 // strcpy(stu.name, "abc"); // stu.age = 11; // strcpy(stu.tel, "15557125722"); // stu.scores[0] = 100; // stu.scores[1] = 11; // stu.scores[2] = 33; //别名在struct起好了 // strcpy(stu.name, "abc"); // stu.age = 11; // strcpy(stu.tel, "15557125722"); // stu.scores[0] = 100; // stu.scores[1] = 11; // stu.scores[2] = 33; printf("姓名: %s\n", stu.name); printf("年龄: %d\n", stu.age); printf("电话: %s\n", stu.tel); printf("成绩: %.1f %.1f %.1f\n", stu.scores[0], stu.scores[1], stu.scores[2]); printf("性别: %s\n", stu.sex == 'M' ? "男" : "女"); getchar(); return EXIT_SUCCESS; } ~~~ # 结构体大小 结构体存储,内存对齐 ~~~ struct students { //成员列表 char name[21]; unsigned int age; char tel[16]; float scores[3]; char sex; } stu = {"尼古拉斯", 500, "15557105721", 100.0f, 200, 300, 'M'}, stu1 = {"abc", 50, "15557105721", 100.0f, 200, 300, 'M'}; int main() { printf("%d\n", sizeof(stu1)); getchar(); return EXIT_SUCCESS; } ~~~ # 结构体数组 ~~~ #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> struct students { //成员列表 char name[21]; unsigned int age; char tel[16]; float scores[3]; char sex; }; int main() { struct students s[2]; for (int i = 0; i < 2; ++i) { printf("请输入\n"); scanf("%s%d%s%f%f%f%c", s[i].name, &s[i].age, s[i].tel, &s[i].scores[0], &s[i].scores[1], &s[i].scores[2], &s[i].sex); } for (int j = 0; j < 2; ++j) { printf("姓名: %s\n", s[j].name); printf("年龄: %d\n", s[j].age); printf("电话: %s\n", s[j].tel); printf("成绩: %.1f %.1f %.1f\n", s[j].scores[0], s[j].scores[1], s[j].scores[2]); printf("性别: %s\n", s[j].sex == 'M' ? "男" : "女"); printf("----------------\n"); } getchar(); return 0; } ~~~ # 结构体和指针 **属性指针** ~~~ #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> struct stuinfo { char * name; int age; }; int main() { struct stuinfo si; si.name = (char *)malloc(sizeof(char) * 21); strcpy(si.name, "张三"); si.age = 18; printf("%s %d\n", si.name, si.age); free(si.name); getchar(); return 0; } ~~~ **指针指向结构体地址** ~~~ struct sinfo { char * name; int age; }stu; int main() { struct sinfo * s = &stu; s->name = (char *)malloc(sizeof(char) * 21); strcpy(s->name, "abc"); s->age = 11; printf("%s %d\n", s->name, s->age); free(s->name); getchar(); return 0; } ~~~ **指针指向分配的空间** ~~~ struct tec { char * name; int age; }t; int main() { struct tec * p = (struct tec *)malloc(sizeof(t)); p->name = (char *)malloc(sizeof(char) * 21); strcpy(p->name, "abc"); p->age = 121; printf("%s %d\n", p->name, p->age); if (p->name != NULL) { free(p->name); p->name = NULL; } if (p) { free(p); p = NULL; } getchar(); return 0; } ~~~ # 结构体嵌套 ~~~ struct stra { int a; float b; char c; }abc; struct strb { struct stra abc; char * e; short f; double d; }; int main() { struct strb strbb; strbb.d = 10.0f; strbb.abc.a = 100; printf("%d\n", strbb.abc.a); getchar(); return 0; } ~~~ # 结构体指针偏移 ~~~ struct Person { char a; int b; char c; int d; }; int main() { struct Person p = {'a', 100, 'b', 200}; printf("%d\n", sizeof(p)); //16 //2个相同,16-4就是p.d的地址 printf("%d\n", (char *) &p + 12); printf("%d\n", &(p.d)); return 0; } ~~~ # 堆上和栈上分配空间 ~~~ //堆上分配空间 struct Person *p1 = (Person *) malloc(sizeof(struct Person)); strcpy(p1->name, "abc"); p1->age = 11; printf("name: %s, Age: %d\n", p1->name, p1->age); //栈上分配结构体空间 struct Person persons[] = { {"aaa", 123}, {"bbb", 456}, {"ccc", 789}, {"ddd", 101112}, {"eee", 131415} }; int len = sizeof(Person) / sizeof(struct Person); ~~~ # 结构体赋值 如果结构体内部有指针,并且指针指向堆空间. 那么如果发生赋值行为,就会产生2个问题 1. 同一个空间被释放2次 2. 内存泄露 所以不要直接=,如果内部有指针,自己按个赋值拷贝 ![](https://box.kancloud.cn/5d47d66b42ad592063bb8aa98160b52d_2114x1376.png)