目录
[1]递归函数
递推:从原问题出发,按递归公式从未知到已知,最终到达递归终止条件
回归:按递归的终止条件求出结果,你想逐步带入递归公式,回到原问题求解
int fun(int n)
{
if(n==1)
return 1;
return n*fun(n-1);
}
int main(int argc, char const *argv[])
{
int res=fun(5);
printf("%d\n",res);
return 0;
}
[2]结构体
用户在使用时自定义的一种数据类型
格式:
struct 结构体名
{
数据类型 成员变量名1; //不能等号赋值
数据类型 成员变量名2;
数据类型 成员变量名3;
}
数据类型==struct star
struct star
{
int id;
float height;
char name[33];
};
结构体变量
1、定义的同时定义结构体变量
struct 结构体名
{
数据类型 成员变量名1; //不能等号赋值
数据类型 成员变量名2;
数据类型 成员变量名3
}结构体变量
struct star
{
int id;
char name[33];
}s;
2、先定义结构体在定义结构体变量
struct star tnt; //定义全局结构体变量
int main(int argc, char const *argv[])
{
struct star tf; //定义局部的结构体变量
return 0;
}
缺省结构体名
struct //省略结构体名
{
int id;
float height;
char in[33];
}zyq; //不能省略结构体变量名
赋值
1、定义的同时用{ }去赋值
struct star
{
int id;
float height;
char in[33];
};
struct star lyf={1,170,"liuyifei"};
先定义结构体,再单独赋值
struct star
{
int id;
float height;
char name;
};
struct star lyf;
int main(int argc, char const *argv[])
{
lyf.id=2;
lyf.height= 188;
strcpy(lyf.name,"liuyifei");
//strcpy字符串的赋值除了初始化外只能采用strcpy函数赋值
return 0;
}
3、点等法
.结构体名=进行赋值
struct star
{
int id;
float height;
char name;
};
struct star lyf=
{
.id=2,
.height=140,
.name="liuyifei"
};
访问
结构体变量名.成员变量名
scanf("%d %s",&s.id,s.name);
printf("%d %s\n",s.id,s.name);
重命名
1、定义的时候直接重命名
typedef struct str
{
int id;
float height;
char name[33];
} st;
2、先定义结构体,再重命名
struct star
{
int id;
float height;
char name[33];
};
struct star lyf; //定义结构体变量名
struct star xg; //定义结构体变量名
typedef struct star ST; //重命名结构体变量名
结构体数组
结构体类型相同的变量
定义
1、定义结构体时,定义结构体数组
struct star
{
int id;
float height;
char name;
}s[3];
2、先定义结构体,在定义结构体数组
struct star
{
int id;
float height;
char name;
};
struct star s[3];
初始化
1、定义结构体时直接赋值
struct star
{
int id;
float height;
char name[33];
};
struct star s[3];
struct star s[3]=
{
{1,178.99,"heloo"},
{3,156.44,"asdf"},
{4,199.77,"idfas"}
};
2、先定义,再单独赋值
struct star s[3];
s[0].id=4;
s[0].height=188;
strcpy(s[0].name,"zhouchuanxiong");
结构体数组的输入输出
struct star s[3];
for(int i = 0; i < 3; i++)
{
scanf("%d %f %s",&s[i].id,&s[i].height,&s[i].name);
}
for(int i = 0; i < 3; i++)
{
printf("%d %f %s\n",&s[i].id,&s[i].height,&s[i].name);
}
练习:创建一个名为student的结构体数组,包含学号,姓名,分数,(数据类型自己定义),从终端输入学生的信息并打印分数及格的学生信息(输入3人即可)
struct student
{
int xh;
char name[33];
int fs;
}a[3];
int main(int argc, char const *argv[])
{
struct student a[3];
printf("请输入:\n");
printf("学号\t姓名\t分数");
for(int i=0;i<3;i++)
{
scanf("%d %s %d",&a[i].xh,a[i].name,&a[i].fs);
}
printf("打印:\n");
printf("学号\t姓名\t分数\n");
for(int i=0;i<3;i++)
{
if(a[i].fs<60)
{
printf("%d\t%s\t%d\n",a[i].xh,a[i].name,a[i].fs);
}
}
return 0;
}
结构体指针
struct 结构提名 *指针变量名
struct star
{
int id;
char name[33];
}st; //定义结构体
struct star s[3]; //定义结构体数组
struct star *p=s; //定义结构体数组指针
struct star *q=&st;//定义结构体指针
赋值
结构体指针变量名->成员变量名
#include<string.h>
struct star
{
int id;
char name[33];
}s;
int main(int argc, char const *argv[])
{
struct star *p=&s;//定义结构体指针
p->id=1; //用结构体指针给结构体中的变量赋值
(*p).id=2; //另一种形式的写法
strcpy(p->name,"qinghua");//用指针给结构体中的字符串赋值
printf("%d %s\n",s.id,s.name);
指针大小
printf("%ld\n",sizeof(p)); //8
结构体大小
在64位的操作系统中,默认的value值为8字节,找出结构体中数据类型最大的成员变量和value值对比,按小的数进行对齐
对齐时的地址偏移量是成员变量类型大小的整数倍
为什么要字节对齐?
1) 平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。(提高程序的移植性)
2)性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
3)内存原因:在设计结构体时,通过对齐规则尽可能优化结构体的空间大小至最小空间
共用体
格式;
union 共用体名
{
成员变量列表;
};
定义:
union共用体名 共用体变量名;
union star
{
int a;
char b;
}s;
int main(int argc, char const *argv[])
{
s.a=65;
s.b='B';
printf("%d %c\n",s.a,s.b);
特点:
成员变量共用同一块空间,赋值以最后一次赋值为准
共用体的大小时成员变量中数据类型最大的
共用体验证大小端
s.a=0x12345678;
printf("%#x\n",s.b); //0x78
枚举
格式:
enum 枚举名
{
val1;
val2;
...
}
enum num
{
val1,
val2=99,
val3
};
int main(int argc, char const *argv[])
{
// 未赋值时,值从0开始
printf("%d %d %d\n",val1,val2,val3);
存储类型
auto修饰变量,一般省略时,都认为是auto类型
static修饰变量和函数
存储在静态区
静态变量已初始化在.data区 未初始化变量存储在 .bss
修饰的变量,生命周期会被延长到整个程序(变量只初始化一次)
修饰全局变量和函数,限制在本文件使用
void fun()
{
static int a=5;
a++;
printf("%d\n",a); //6 7 8
}
int main(int argc, char const *argv[])
{
fun();
fun();
fun();
标签:star,struct,int,基础,char,day10,id,name
From: https://blog.csdn.net/2301_77416261/article/details/142341506