1:结构体定义以及结构体变量声明
//定义,大括号里面的是结构体成员,定义的方法和普通变量定义一致:类型说明符 变量名
struct stu
{
int num;
char name[20];
char sex;
float score;
};
//声明结构体变量
struct stu boy1,boy2;
2:结构体变量的成员的表示方法
boy1.name="god"
我想可以这样理解:把这个结构体变量看作是一个对象,而对象里包含属性(这里所说的成员)简单点就是boy1对象的name属性为god
3:结构体变量的初始化:
struct stu
{
int num;
char name[20];
char sex;
float score;
};
struct stu boy1,boy2;
boy1={102,"Zhang ping",'M',78.5};
boy2=boy1;
4: 结构体型数组的定义,日常中经常会遇到学生对象这样的群体,可以用结构体型数组来表示
struct stu
{
int num;
char *name;
char sex;
float score;
}boy[5]={
{101,"Li ping","M",45},
{102,"Zhang ping","M",62.5},
{103,"He fang","F",92.5},
{104,"Cheng ling","F",87},
{105,"Wang ming","M",58};
}
5:一个指针变量当用来指向一个结构体变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构体变量的首地址。通过结构指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。
struct stu boy; struct stu *pstu; pstu=&boy
6:结构体指针变量的赋值是把结构体变量的首地址赋予该指针变量7:通过结构体指针变量访问结构体变量的各个成员。其访问的一般形式为:(*结构指针变量).成员名或为:结构指针变量->成员名例如:(*pstu).num或者:pstu->num其中(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”8:结构变量.成员名(*结构指针变量).成员名结构指针变量->成员名这三种用于表示结构成员的形式是完全等效的。9:指向结构体型的数组的指针
struct stu { int num; char *name; char sex; float score; }boy[5]={ {101,"Zhou ping",'M',45}, {102,"Zhang ping",'M',62.5}, {103,"Liou fang",'F',92.5}, {104,"Cheng ling",'F',87}, {105,"Wang ming",'M',58}, }; main() { struct stu *ps; printf("No\tName\t\t\tSex\tScore\t\n"); for(ps=boy;ps<boy+5;ps++)//指针ps指向boy数组的首地址,每循环一次,指针向后指向下一个boy数组元素 printf("%d\t%s\t\t%c\t%f\t\n",ps->num,ps->name,ps->sex,ps->score); }
10:结构体指针变量(指向一个结构体变量的指针)作函数参数
struct stu { int num; char *name; char sex; float score;}boy[5]={ {101,"Li ping",'M',45}, {102,"Zhang ping",'M',62.5}, {103,"He fang",'F',92.5}, {104,"Cheng ling",'F',87}, {105,"Wang ming",'M',58}, }; main() { struct stu *ps; void ave(struct stu *ps); ps=boy; ave(ps); } void ave(struct stu *ps) { int c=0,i; float ave,s=0; for(i=0;i<5;i++,ps++)//指针往后移动依次访问结构体数组元素的成员score { s+=ps->score; //累加 if(ps->score<60) c+=1; } printf("s=%f\n",s); ave=s/5; //求平均 printf("average=%f\ncount=%d\n",ave,c); }
11:数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。
12:内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
13:分配内存空间函数malloc
调用形式:
(类型说明符*)malloc(size)
功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。
“类型说明符”表示把该区域用于何种数据类型。
(类型说明符*)表示把返回值强制转换为该类型指针。
“size”是一个无符号数。
例如:
pc=(char *)malloc(100);
14:分配内存空间函数 calloc
calloc 也用于分配内存空间。
调用形式:
(类型说明符*)calloc(n,size)
功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。
(类型说明符*)用于强制类型转换。
calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。
例如:
ps=(struet stu*)calloc(2,sizeof(struct stu));
其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps
15:释放内存空间函数free
调用形式:
free(void*ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域
16:main() { struct stu { int num; char *name; char sex; float score; } *ps; ps=(struct stu*)malloc(sizeof(struct stu)); ps->num=102; ps->name="Zhang ping"; ps->sex='M'; ps->score=62.5; printf("Number=%d\nName=%s\n",ps->num,ps->name); printf("Sex=%c\nScore=%f\n",ps->sex,ps->score); free(ps); }