首页 > 其他分享 >c基础day10

c基础day10

时间:2024-09-18 20:20:05浏览次数:3  
标签:star struct int 基础 char day10 id name

目录

[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();

标签:star,struct,int,基础,char,day10,id,name
From: https://blog.csdn.net/2301_77416261/article/details/142341506

相关文章

  • [Java基础]Stream流
    当我第一次阅读Java8中的StreamAPI时,说实话,我非常困惑,因为它的名字听起来与JavaI0框架中的InputStream和OutputStream非常类似。但是实际上,它们完全是不同的东西。Java8Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式的操作。本文......
  • 2024Mysql And Redis基础与进阶操作系列(2)作者——LJS[含MySQL登录;DDL;DML;举例说明;编码
    目录1.MySQL的登录1.1服务的启动和停止方式1:使用图形界面工具步骤1:打开windows服务 步骤2:找到MySQL80(点击鼠标右键)→启动或停止(点击)编辑补充说明2点:1.2自带客户端的登录与退出登录方式1:MySQL自带客户端注意:退出登录2MySQL数据库基本操作-DDL和DML2.1.DDL解释2.......
  • 网络基础--UPnP基本原理
    1、简介UPnP是通用即插即用(UniversalPlugandPlay)的缩写,主要用于设备的智能互联互通,使用UPnP协议不需要设备驱动程序,它可以运行在目前几乎所有的操作系统平台上,使得在办公室、家庭和其他公共场所方便地构建设备互联互通成为可能。UPNP为NAT(网络地址转换)穿透带来了一个解决方案:......
  • JavaSE——Java基础语法(黑马个人听课笔记)
    1.关键字介绍关键字:被Java赋予了特定含义的英文单词关键字的字母全部小写 常用的代码编辑器,针对关键字由特殊的颜色标记,非常直观2.常量2.1常量概述常量:在程序的执行过程中,其值不会发生改变的量(数据)  2.2常量的分类:字符串常量:被双引号包裹的内容整数常量:所......
  • 网络基础--UPnP基本原理
    1、简介UPnP是通用即插即用(UniversalPlugandPlay)的缩写,主要用于设备的智能互联互通,使用UPnP协议不需要设备驱动程序,它可以运行在目前几乎所有的操作系统平台上,使得在办公室、家庭和其他公共场所方便地构建设备互联互通成为可能。UPNP为NAT(网络地址转换)穿透带来了一个解决方案:......
  • [Java基础]集合的删除操作
    在Java中,直接在遍历集合时删除元素会引发ConcurrentModificationException,因为集合的结构在迭代过程中发生了变化。为了避免这种问题,可以使用Iterator或ListIterator来进行安全删除。下面介绍几种常见的方式。1.使用Iterator进行删除使用Iterator是在遍历集合时删除......
  • 网络基础--UPnP基本原理-CSDN博客
    网络基础--UPnP基本原理1、简介UPnP是通用即插即用(UniversalPlugandPlay)的缩写,主要用于设备的智能互联互通,使用UPnP协议不需要设备驱动程序,它可以运行在目前几乎所有的操作系统平台上,使得在办公室、家庭和其他公共场所方便地构建设备互联互通成为可能。UPNP为NAT(网络地址转换......
  • 初探IT世界:从基础到未来
    初探IT世界:从基础到未来1.引言随着科技的不断发展,IT(信息技术)已经成为全球经济的支柱之一。从软件开发、网络安全到数据分析和人工智能,IT领域为我们的日常生活提供了许多不可或缺的技术服务。无论你是初学者,还是想提升自己的技术能力,了解IT行业的基础和前景都是非常有益......
  • 探索IT世界:从技术基础到职业发展
    探索IT世界:从技术基础到职业发展1.引言信息技术(IT)已经深深融入我们的日常生活,成为全球各行各业的核心力量。无论是智能手机应用、网络服务,还是企业的大型系统,IT技术无处不在。如果你是初学者,想要了解IT行业的广度和深度,那么这篇文章将带你全面了解IT的基础知识、热门领域......
  • 你们准备好了吗?Python 入行 AI 的基础技术栈及学习路线
    人工智能(AI)是当今技术发展的重要领域之一,而Python已成为AI领域的首选编程语言之一。Python简单易学,具有丰富的生态系统和社区支持,特别是在AI和机器学习(ML)领域有大量强大的库和框架支持。无论你是刚刚起步的初学者,还是已经有一定编程经验的开发者,了解Python在AI领域的基......