结构体:
eg.把{int sid;
char name[200];
int age;
}
他们组合起来
动态内存的分配与释放
1.为了表示一些复杂的数据,而普通的基本类型无法满足要求
2.结构体是用户根据实际需要自己定义的复合数据类型
#include<stdio.h>
#include<string.h>
struct student{
int sid;
char name[20];
int age;
}
int main()
{
struct student st={1000,"zhangsan",20};
printf("%d %s %d\n",st.sid,st.name,st.age);
}
结果 1000,"zhangsan",20
如何使用结构体?两种方式:
- struct student st={1000,“zhangsan”,20};
- struct student *pst=&st;
st.sid;
pst->std;pst所指向结构体变量中的sid这个成员
注意事项:
结构体变量不能加减乘除,但可以相互赋值
普通结构体变量和结构体指针变量作为函数传参的问题
#include<stdio.h>
#include<string.h>
struct student{
int sid;
char name[20];
int age;
};
void f(struct student *pst)
{ (*pst).sid=99; //普通变量可以用“."
strcpy(pst->name,"zhangsan");
pst->age=22;//指针变量可以用”->"
}
int main()
{
struct student st;//已经为st分配好内存
f(&st);
printf("%d %s %d\n",st.sid,st.name,st.age);
}
结果 99 zhangsan 22
动态内存分配和释放:
#include<stdio.h>
int main()
{
int a[5]={4,10,2,8,6};
}-------静态分配
为什么需要动态分配?
因为静态数组的长度固定死了,只能通过关掉程序进行修改
动态构造一个int 型数组,int *p=(int *)malloc (int len)
1.malloc 只有一个int 型的形参,表示要求系统分配的字节数
2.malloc 函数的功能是请求系统len个字节的内存空间,如果请求分配成功,则返回第一个字节的地址,如果分配不成功,则返回null
3.malloc 函数且只能返回第一个字节的地址,所以我们需要把无实际意义的第一个字节转化成一个有实际意义的地址,malloc 前面必须加(数据类型 *),表示把这个无实际意义的第一个地址转化成相应类型的地址
如:
**int p=(int malloc)(50);
50个字节的第一个字节转化成int类型地址,更准确的说是 把第一个字节转化成四个地址。这样p就指向了第一个的四个字节,p+1就指向了第二个的四个字节,p+i就指向了第i+1的4个字节,p[0]就是第一个元素,*(p+i)就是第i+1个元素
free§;释放p所指向的内存,而不是释放内存p本身所占用的内存。
#include<stdio.h>
#include<malloc.h>
struct student
{ int sid;
int age;
};
void showstudent(struct student *pst)
{
printf("%d %d\n",pst->sid,pst->age);
}
//struct student *是返回类型
struct student *createstudent()
{struct student *p=(struct student *)malloc(sizeof(struct student));
p->sid=99;
p->age=88;
return p; //保存的是地址
}
int main()
{ struct student *ps;
ps=createstudent();
showstudent(ps);
}
结果:99 88