复习:
结构体:不同数据类型的集合 自己定义类型
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]={"######"}