嵌入式第十天

复习:
结构体:不同数据类型的集合 自己定义类型
1.定义结构体
struct stu
{
        int a;
        char ch;
        char name[20];
};

struct stu s1;
s1.a;
s1.ch

struct stu *ps;
ps=&s1; 
(*ps).name 
ps->name

[].->

一、结构体续
1.地址传递--改变变量的值 必须传地址
    #include<stdio.h>
    #include<string.h>
    struct stu
    {
        char name[20];
        int age;
    };

    void change_stu(struct stu *a)//a=s1
    {
        strcpy(a->name,"daming");
        a->age=30;
    }
    int main()
    {
        struct stu s1={"xiaoming",20};
        change_stu(&s1);

        printf("%s %d\n",s1.name,s1.age);
        return 0;

    }

2.值传递:
#include<stdio.h>
    struct stu
    {
        char name[20];
        int age;
    };

    void print_stu(struct stu a)//a大小>4
    {
        printf("name:%s age:%d\n",a.name,a.age);
    }
    int main()
    {
        struct stu s1={"xiaoming",20};
        print_stu(s1);
        return 0;

    }

有时 结构体传参时 即便不希望改变变量值 也会传地址 节省空间
    #include<stdio.h>
    struct stu
    {
        char name[20];
        int age;
    };

    void print_stu(struct stu *a)//4个字节
    {
        printf("name:%s age:%d\n",a->name,a->age);
    }
    int main()
    {
        struct stu s1={"xiaoming",20};
        print_stu(&s1);
        return 0;

    }

二、结构体嵌套
1.定义结构体    
    struct birth
    {
        int year;
        int month;
        int day;
    };    
    struct stu 
    {
        char name[20];
        int age;
        char phone[50];
        struct birth birthday;
    };

2.定义结构体变量
    struct stu s1;    

3.赋值
    s1.birthday.year=1996;
    s1.birthday.month=7;
    s1.birthday.day=12;

4.打印 
printf("%d\n",s1.birthday.year);

练习:定义学生结构体 保存学生信息并输出
    #include<stdio.h>
    struct birth
        {
            int year;
            int month;
            int day;
        };    
        struct stu 
        {
            char name[20];
            int age;
            char phone[50];
            struct birth birthday;
        };
        
    void print_stu(struct stu *pstu)//a=s1
    {
        printf("name:%s age:%d phone:%s birth:%d %d %d\n",pstu->name,pstu->age,pstu->phone,pstu->birthday.year,\
                pstu->birthday.month,pstu->birthday.day);
    }
    int main()
    {
        struct stu s1={"xiaoming",23,"13678934465",1998,7,9};
        print_stu(&s1);
        return 0;

    }    
    
    练习:定义结构体数组 输入10个学生信息 输出
    #include<stdio.h>
    #define N 3
    struct birth
        {
            int year;
            int month;
            int day;
        };    
        struct stu 
        {
            char name[20];
            int age;
            char phone[50];
            struct birth birthday;
        };
        
    void input_stu(struct stu *pstu)
    {
        int i;
        puts("name age phone year month day:");
        for(i=0;i<N;i++)
        {
            scanf("%s%d%s%d%d%d",pstu[i].name,&pstu[i].age,pstu[i].phone,&pstu[i].birthday.year,\
                &pstu[i].birthday.month,&pstu[i].birthday.day);
        }    
    }

    void print_stu(struct stu *pstu)
    {
        int i;
        for(i=0;i<N;i++)
        {
        printf("name:%s age:%d phone:%s birth:%d %d %d\n",pstu[i].name,pstu[i].age,pstu[i].phone,pstu[i].birthday.year,\
                pstu[i].birthday.month,pstu[i].birthday.day);
        }    
    }
    int main()
    {
        struct stu arr[N];
        input_stu(arr);
        print_stu(arr);
        return 0;
    }
    
三、内存分配
1.静态分配:程序在编译时 分配空间
    int a=90; 
    int arr[7]
    struct stu b;
2.动态分配:程序执行时 分配空间

(1)void * malloc(size_t size);
功能:分配空间 size个字节
返回值:如果分配失败 malloc返回NULL

void*:无指定类型的指针 

int *p=(int*)malloc(sizeof(int))
char *p=(char*)malloc(sizeof(char)*100);

例子:
    #include<stdio.h>
    #include<stdlib.h>//malloc的
    int main()
    {
        int *p = (int *)malloc(sizeof(int));//申请sizeof(int)个字节空间 强制转换是为了赋值两边类型一致 
        *p=90;
        printf("%d\n",*p);
        
    }

例子:
    #include<stdio.h>
    #include<stdlib.h>//malloc的
    int main()
    {
        int *p = (int *)malloc(sizeof(int)*10);//强制转换是为了赋值两边类型一致
        int i;
        for(i=0;i<10;i++)
        {
            scanf("%d",&p[i]);
        }
        
        for(i=0;i<10;i++)
        {
            printf("%d ",p[i]);
        }
        
    }

    练习:输入n个整数 然后求和
    #include<stdio.h>
    #include<stdlib.h>//malloc的
    int main()
    {
        int n;
        int sum=0;
        puts("pleae input the num of integer:");
        scanf("%d",&n);

        int *p = (int *)malloc(sizeof(int)*n);//强制转换是为了赋值两边类型一致
        if(NULL==p)//如果申请空间失败
        {
            exit(-1);//退出整个程序
        }
        int i;
        for(i=0;i<n;i++)
        {
            scanf("%d",&p[i]);//p+i
            sum = sum+p[i];//sum=sum+*(p+i)
        }
        printf("%d\n",sum);
        
    }
        
(2)释放空间
void free(void *ptr);

总结:
a.malloc和free成对出现    
b.malloc可能不成功 做错误处理


struct person
    {
        char name[20];
        int age;
    };

int main()
{
    struct person *p = (struct person*)malloc(sizeof(struct person));
    strcpy(p->name,"xiaoming");
    p->age=90;
    
}    
    
    
改版:数组空间 通过malloc申请
结构体输入人的姓名和年龄 输出年龄最大的人的姓名和年龄
    #include<stdio.h>
    #include<stdlib.h>
    #define N 3
    struct person
    {
        char name[20];
        int age;
    };

    void input_data(struct person *p)
    {
        int i;
        puts("name age:");
        for(i=0;i<N;i++)
        {
            scanf("%s%d",p[i].name,&p[i].age);
        }
    }

    void find_max_age(struct person *p)
    {
        int i;
        int max=0;
        struct person max_person;
        for(i=0;i<N;i++)
        {
            if(max<p[i].age)
            {
                max = p[i].age;
                max_person = p[i];
                printf("%s %d\n",p[i].name,p[i].age);
            }
        }
        printf("name:%s age:%d\n",max_person.name,max_person.age);
    }
    int main()
    {
        struct person *p=(struct person *)malloc(sizeof(struct person)*N);
        if(NULL==p)
        {
            puts("malloc error!");
            exit(-1);
        }
        input_data(p);
        find_max_age(p);    
        free(p);
        return 0;
    }    

1.扫雷
两个二维数组
char lei[9][9]={0};
char show[9][9]=;

x=rand()
y=rand()    
    
3,5
lei[3][5]='1'

2.推箱子

char a[50][50]={"######"}

    
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值