数据结构--sumary2-结构体,-c语言

结构体
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

如何使用结构体?两种方式:

  1. struct student st={1000,“zhangsan”,20};
  2. 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值