c基础day10

目录

[1]递归函数

[2]结构体

结构体变量

赋值

访问

重命名

结构体数组

定义

初始化

结构体数组的输入输出

结构体指针

结构体大小

共用体

枚举

存储类型


[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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值