1、day10作业
使用的代码
#include<stdio.h>
void change(int* i)
{
*i=(*i) / 2;
}
int main()
{
int i = 0;
scanf("%d", &i);
change(&i);
printf("%d", i);
return 0;
}
2、day11作业
使用的代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
char* p;
int n;//存储申请多少字节的空间大小
char c;
scanf("%d", &n);
p = malloc(n);
scanf("%c", &c);//在使用gets()前,必须调用scanf()用于清除前面遗留的换行符,不然gets()读取的是换行符。gets特点是:读取到换行符后不再读取
gets(p);
puts(p);
return 0;
}
总结:
①malloc()
申请空间的方法:定义指针,malloc()申请后返回值放到该指针中。
②gets()
接收数据的方法:参数是指针,将读入的数据放到该指针对应的空间中。
③gets()
和scanf()
之间一定要有一个scanf()
,用于处理前面遗留的换行符,所以需要而外定义一个字符变量c
,用于存放该换行符。
④puts()
输出数据:puts()
的参数是指针,输出该指针对应空间中的数据。
3、day12作业
使用的代码
#include<stdio.h>
int step(int n)
{
if (1 == n)
{
return 1;
}
if (2 == n)
{
return 2;
}
return step(n - 1) + step(n - 2);//返回n减去两种情况的递归之和
}
int main()
{
int n;//存储台阶
scanf("%d", &n);
printf("%d", step(n));
return 0;
}
说明
因为一次只能走1个c或2个台阶,所以到达第n级台阶有两种方法,从第n-2级直接上来,或从n-1级上 来。所以到达第n级台阶,一定是 step(n-1)+step(n-2) 的求和状态。所以在递归中,最后返回的是 step(n-1)+step(n-2) 的结果。
4、结构体
a.结构体的定义
a-1:语法:
struct 结构体名
{
变量类型 变量名1;
变量类型 变量名2;
};
使用的代码:
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};//结构体的声明
b.结构体的初始化
b-1:创建单个结构体变量
语法:
struct 结构体名 结构体变量 = {给结构体中的成员进行具体赋值}
代码:
//创建结构体的单个变量
struct student s = { 1001,"lele",'M',20,85.4,"Shenzhen" };
b-2:创建结构体数组
创建数组结构体语法:
struct 结构体名 数组名[数组大小]
代码:
//创建结构体数组
struct student sarr[3];
c.赋值语法
&数组名[下标].成员变量名
在赋值时,是否需要&:需要结合具体的成员变量时是否是数组,若是数组,则不需要&;若不是数组,
则需要&
代码:
for (i = 0; i < 3; i++)
{
scanf("%d%s %c%d%f%s", &sarr[i].num, sarr[i].name, &sarr[i].sex, &sarr[i].age,&sarr[i].score, sarr[i].addr);
}
可以借助for循环进行循环赋值。
注意:.
后是访问的具体变量。
d.访问结构体中的具体变量的方法
d-1:访问单个变量
语法:
结构体单个变量名.成员名
代码:
//访问单个结构体变量中的具体的成员变量
printf("%d %s %c %d %5.2f %s\n", s.num, s.name, s.sex, s.age, s.score, s.addr);
注意:当读取%s和%c同时出现时,中间一定要有一个空格,不然%c读取到的就是空格了。
d-2:访问结构体数组变量
语法:
数组名[下标].成员名
代码:
for (i = 0; i < 3; i++)
{
printf("%d %s %c %d %f %s", sarr[i].num, sarr[i].name, sarr[i].sex,
sarr[i].age,sarr[i].score, sarr[i].addr);
}
利用循环,对数组进行访问。
5、结构体指针
a.结构体大小
语法:sizeof(结构体名)
由于内存为了使地址对齐,会导致实际大小比人工通过加法运算得到的空间更大。对齐是为了更高效的取内存中的数据。
如下所示:
为了对齐,会把★处的两个空间,也算作该结构体的空间。
b.结构体指针的说明
b-1:创建结构体指针
语法:
struct
结构体名*指针名
代码:
struct student* p;
b-2:成员选择运算符
.
用于结构体变量在访问具体成员结果时使用
代码:结构体变量名.结构体成员名:得到该成员
->
用于结构体指针在访问具体成员结果时使用
代码:结构体指针名->结构体成员名:得到该成员
c.使用的代码:
struct student
{
int num;
char name[20];
char sex;
};
int main()
{
struct student s = { 1001,"wangle", 'M' };
//创建结构体指针变量
struct student* p;
p = &s;
printf("%d %s %c\n", (*p).num, (*p).name, (*p).sex);//注意:.的优先级比*(取值运算符)的优先级高
printf("%d %s %c\n", p->num, p->name, p->sex);
// 结构体数组初始化
struct student sarr[3] = { 1001,"lilei",'M',1005,"zhangsan",'M',1007,"lili",'F'};
//p是指针,sarr是数组首元素的地址,所以p指向的是数组首元素的地址。
p = sarr;
int num;
printf("-----------------------------------\n");
num = p->num++;// 当++表达式中的前面的运算符优先级更高时,则++的对象是整体:p->num:即是此整体进行++运算
printf("num=%d,p->num=%d", num, p->num);//1001,1002
num = p++->num;//此时++的对象是p这个指针,++后指向第二个元素1002,1005
printf("num=%d,p->num=%d", num, p->num);// 后置++,表示先试用初始值,在进行++,所以此处先
使用初始值为:p->num,再进行++:(p++)->num
return 0;
}
注意:
1、.的优先级大于*的优先级
2、对于后置++的说明:
直接去除++后直接赋值,然后再++进行操作