1.结构体
(1)定义结构体
struct Teacher
{
char name[64];
int age;
int id;
};
void main()
{
struct Teacher t1; //告诉C编译器给我分配内存
printf("hello...\n");
system("pause");
return;
}
(2)定义变量的三种方法
//用类型定义变量
typedef struct Teacher
{
char name[64];
int age;
int id;
}Teacher;
//定义类型的同时 定义变量
struct Student
{
char name[64];
int aga ;
}s1, s2 ;
//匿名类型 定义变量
struct
{
char name[64];
int aga ;
}s3, s4;
(3)初始化变量的三种方法
//定义变量 ,然后初始化
Teacher t1 = {"aaaa", 31, 01};
struct Student
{
char name[64];
int aga ;
}s5 = {"names", 21};
struct
{
char name[64];
int aga ;
}s6 = {"names", 21};
(4)变量的引用
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct Teacher
{
char name[64];
int age;
int id;
}Teacher;
void main()
{
Teacher t1; //告诉C编译器给我分配内存
Teacher t2 = { "aaaa", 32, 02 };
t1.age = 31; //t1.操作符是寻址操作 计算age相对于t1大变量的偏移量
strcpy(t1.name, "t1name");
printf("t1.name:%s \n", t1.name);
//通过指针的方式操作内存空间
{
Teacher *p = NULL;
p = &t2;
printf("p->age:%d \n", p->age); //-> 是寻址操作 算age相对于t2大变量的偏移量
printf("p->name:%s \n", p->name);
}
printf("hello...\n");
system("pause");
return;
}
(5)结构体做函数参数
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct Teacher
{
char name[64];
int age;
int id;
}Teacher;
void copyTeacher01(Teacher to, Teacher from)
{
to = from;
}
void copyTeacher02(Teacher *to, Teacher *from)
{
//(*to) = (*from);
*to = *from;
}
void main()
{
Teacher t1 = { "aaaa", 32, 02 };
Teacher t2;
Teacher t3;
memset(&t3, 0, sizeof(t3));
t2 = t1; //=号操作下编译器的行为
//编译器给我们提供简单=号赋值操作
printf("t2.name:%s \n", t2.name);
printf("t2.age:%d \n", t2.age);
copyTeacher01(t3, t1);
printf("copyTeacher01() after \n");
printf("t3.name:%s \n", t3.name);
printf("t3.age:%d \n", t3.age);
printf("\n");
copyTeacher02(&t3, &t1);
printf("copyTeacher02() after \n");
printf("t3.name:%s \n", t3.name);
printf("t3.age:%d \n", t3.age);
printf("\n");
system("pause");
return;
}
(6)结构体数组
结构体数组,输入老师的年龄,排序(通过数组操作)
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct Teacher
{
char name[64];
int age;
int id;
}Teacher;
void printTeacher(Teacher *array, int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("age:%d \n", array[i].age);
}
}
void sortTeacer(Teacher *array, int num)
{
int i, j;
Teacher tmp;
for (i = 0; i < num; i++)
{
for (j = i + 1; j<num; j++)
{
if (array[i].age > array[j].age)
{
tmp = array[i]; //=号操作 赋值操作
array[i] = array[j];
array[j] = tmp;
}
}
}
}
// 结构体数组 输入老师的年龄,排序
void main()
{
int i = 0;
Teacher Array[3];
int num = 3;
for (i = 0; i < num; i++)
{
printf("\nplease enter age:");
scanf("%d", &(Array[i].age));
}
printTeacher(Array, num);
sortTeacer(Array, num);
printf("排序之后\n");
printTeacher(Array, num);
printf("hello...\n");
system("pause");
return;
}
结构体数组,输入老师的年龄,排序(通过指针操作)
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct Teacher
{
char name[64];
int age;
int id;
}Teacher;
void printTeacher(Teacher *array, int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("age:%d \n", array[i].age);
}
}
void sortTeacer(Teacher *array, int num)
{
int i, j;
Teacher tmp;
for (i = 0; i < num; i++)
{
for (j = i + 1; j<num; j++)
{
if (array[i].age > array[j].age)
{
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
}
Teacher * createTeacher(int num)
{
Teacher * tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher)* num); //相当于Teacher Array[3]
if (tmp == NULL)
{
return NULL;
}
return tmp;
}
void FreeTeacher(Teacher *p)
{
if (p != NULL)
{
free(p);
}
}
void main()
{
int i = 0;
int num = 3;
Teacher *pArray = NULL;
pArray = createTeacher(num);
for (i = 0; i < num; i++)
{
printf("\nplease enter age:");
scanf("%d", &(pArray[i].age));
}
printTeacher(pArray, num);
sortTeacer(pArray, num);
printf("排序之后\n");
printTeacher(pArray, num);
FreeTeacher(pArray);
printf("hello...\n");
system("pause");
return;
}
(7)结构体中套一级指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct Teacher
{
char name[64];
char *alisname;//一级指针
int age ;
int id;
}Teacher;
void printTeacher(Teacher *array, int num)
{
int i = 0;
for (i=0; i<num; i++)
{
printf("age:%d \n", array[i].age);
}
}
void sortTeacer(Teacher *array, int num)
{
int i,j;
Teacher tmp;
for (i=0; i<num; i++)
{
for (j=i+1; j<num; j++)
{
if (array[i].age > array[j].age)
{
tmp = array[i]; //=号操作 赋值操作
array[i] = array[j];
array[j] = tmp;
}
}
}
}
int createTeacher(Teacher **pT, int num)
{
int i = 0;
Teacher * tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher) * num); // Teacher Array[3]
if (tmp == NULL)
{
return -1;
}
memset(tmp, 0, sizeof(Teacher) * num);
for (i=0; i<num; i++)
{
tmp[i].alisname = (char *)malloc(60);
}
*pT = tmp; //二级指针形参 去间接的修改 实参 的值
return 0; //
}
//释放内存
void FreeTeacher(Teacher *p, int num)
{
int i = 0;
if (p == NULL)
{
return;
}
for (i=0; i<num; i++)
{
if (p[i].alisname != NULL)
{
free(p[i].alisname);
}
}
free(p);
}
void main()
{
int ret = 0;
int i = 0;
int num = 3;
Teacher *pArray = NULL;
ret = createTeacher(&pArray, num);
if (ret != 0)
{
printf("func createTeacher() er:%d \n ", ret);
return ret;
}
for (i=0; i<num; i++)
{
printf("\nplease enter age:");
scanf("%d", & (pArray[i].age) );
printf("\nplease enter name:");
scanf("%s", pArray[i].name ); //向指针所指的内存空间copy数据
printf("\nplease enter alias:");
scanf("%s", pArray[i].alisname ); //向指针所指的内存空间copy数据
}
printTeacher(pArray, num);
sortTeacer(pArray, num);
printf("排序之后\n");
printTeacher(pArray, num);
FreeTeacher(pArray, num);
printf("hello...\n");
system("pause");
return ;
}
(8)结构体中套一级、二级指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct Teacher
{
char name[64];
char *alisname; //一级指针
char **stuname; //二级指针
int age;
int id;
}Teacher;
void printTeacher(Teacher *array, int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("age:%d \n", array[i].age);
}
}
void sortTeacer(Teacher *array, int num)
{
int i, j;
Teacher tmp;
for (i = 0; i < num; i++)
{
for (j = i + 1; j<num; j++)
{
if (array[i].age > array[j].age)
{
tmp = array[i]; //=号操作 赋值操作
array[i] = array[j];
array[j] = tmp;
}
}
}
}
int createTeacher(Teacher **pT, int num)
{
int i = 0, j = 0;
Teacher * tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher)* num); // Teacher Array[3]
if (tmp == NULL)
{
return -1;
}
memset(tmp, 0, sizeof(Teacher)* num);
for (i = 0; i < num; i++)
{
char **p = NULL;
//malloc一级指针
tmp[i].alisname = (char *)malloc(60);
//二级指针的第三种内存模型
p = (char **)malloc(3 * sizeof(char *)); //打造二维内存
for (j = 0; j < 3; j++)
{
p[j] = (char *)malloc(120);
}
tmp[i].stuname = p;
}
*pT = tmp; //二级指针 形参 去间接的修改 实参 的值
return 0; //
}
void FreeTeacher(Teacher *p, int num)
{
int i = 0, j = 0;
if (p == NULL)
{
return;
}
for (i = 0; i < num; i++)
{
//释放一级指针
if (p[i].alisname != NULL)
{
free(p[i].alisname);
}
//释放二级指针
if (p[i].stuname != NULL)
{
char **myp = p[i].stuname;
for (j = 0; j < 3; j++)
{
if (myp[j] != NULL)
{
free(myp[j]);
}
}
free(myp);
p[i].stuname = NULL;
}
}
free(p);
}
void main()
{
int ret = 0;
int i = 0, j = 0;
int num = 3;
Teacher *pArray = NULL;
ret = createTeacher(&pArray, num);
if (ret != 0)
{
printf("func createTeacher() er:%d \n ", ret);
return;
}
for (i = 0; i < num; i++)
{
printf("\nplease enter age:");
scanf("%d", &(pArray[i].age));
printf("\nplease enter alias:");
scanf("%s", pArray[i].alisname); //向指针所指的内存空间copy数据
for (j = 0; j < 3; j++)
{
printf("please enter student name:");
scanf("%s", pArray[i].stuname[j]);
}
}
printTeacher(pArray, num);
sortTeacer(pArray, num);
printf("排序之后\n");
printTeacher(pArray, num);
FreeTeacher(pArray, num);
printf("hello...\n");
system("pause");
return;
}
2.结构体的深copy和浅copy
(1)代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//结构体定义下来,则结构体中的成员的内存布局就定下了。
typedef struct Teacher
{
char name[64];
int age ;
char *pname2;//一级指针
}Teacher;
//编译器的=号操作,只会把指针变量的值,从from copy 到 to,但
//不会把指针变量所指的内存空间给copy过去..//浅copy
void copyTeacher(Teacher *to, Teacher *from)
{
*to = *from;
//如果想深copy,再执行内存分配
to->pname2 = (char *)malloc(100);
strcpy(to->pname2, from->pname2);
}
void main()
{
Teacher t1;
Teacher t2;
strcpy(t1.name, "name1");
t1.pname2 = (char *)malloc(100);
strcpy(t1.pname2, "ssss");
//t1 复制给 t2
copyTeacher(&t2, &t1);
printf("释放前pname2:%s\n", t2.pname2);
if (t1.pname2 != NULL)
{
free(t1.pname2);
t1.pname2 = NULL;
}
if (t2.pname2 != NULL)
{
free(t2.pname2);
t2.pname2 = NULL;
}
printf("释放后pname2:%s\n", t2.pname2);
printf("hello...\n");
system("pause");
return ;
}
(2)内存图
(3)运行结果