C语言学习(五)-结构体、自定义函数、数据占用空间计算等

对于c语言有了初步的理解之后,我们就可以学习真正意义上的c语言程序设计了,从今天开始,将从每个小的知识点进行讲解,逐步的引入常用的函数及操作符,今天的主要内容为结构体、自定义函数、数据占用空间的计算、常用的操作符等

结构体

什么是结构体?又为什么要引入结构体的概念?在c语言中如何定义结构体?定义的结构体如何使用,本节将从这几个方面进行详细的阐述。

定义

结构体的官网定义,可以自己查看百度词条的解释,下面链接可以直达:
结构体
大家可以自行查看,我在此处仅以我自己对其的理解进行解读:
在我看来,结构体就是把一些和某一个参数有关的参数存放在一个容器中,以后想要使用其中的某个参数时,直接条用该结构体即可,
比如在雷达中有很多的参数,载频,带宽,脉宽等等,或者车辆的位置、速度、加速度等信息,前述内容参数均与雷达有关,后述内容均与车辆有关,那么我就可以定义两个结构体,在访问带宽或者速度时直接调用结构体即可

结构体的好处

为什么要引用结构体呢,当某个参数下变量有很多时,结构体可以清楚的帮助我们定义和访问相关的数据,封装好的结构体方面使用,这对于项目开发极为重要,某参数经常使用时,不必在每个函数中都声明某个变量的值,只需定义在结构体内,需要时访问即可。

结构体的定义方式

c语言中,结构体的定义方式需要使用关键字struct,其定义格式如下:

  • 声明一个名字为Radar的结构体,然后将要定义的参数名以及类型放入其中
  • 在主函数中对定义的参数进行赋值,赋值方式为
struct Radar radar = {xx,xxx,xxx};

注意:此处的radar即为真正的结构体的名字,以后想用用其值直接“radar.”进行索引即可

整个流程如以下实例代码:

#include<stdio.h>
struct Radar
{
    int fc ;
    int B ;
    double Tp ;
    char type ;
    //其余的变量依次定义即可
};
struct  Radar radar ={25000,12,0.125,'r'};

int main()

{
    double sum = 0;
    sum  = radar.Tp - radar.B;
    printf("雷达的类型为%c\n",radar.type);
    printf("雷达的带宽为%d\n",radar.B);
    printf("sum = %lf\n",sum);
    return 0;
}

在此处我们定义了一个名字为radar的结构体,定义的类型有我们熟悉的整型,还算熟悉的双精度浮点型,不是很熟悉的字符型,下面简要介绍字符变量。
字符变量即为存放字符常量的变量,同样如果多个字符进行存储,自然就成为了字符串类型
整型和双精度浮点型的打印类型想必大家早已了然于心,今天新介绍两种打印类型------字符的打印类型为%c,字符串的打印类型为%s,保存编译运行可以得到以下结果:
在这里插入图片描述

注:结构体的定义位置并未有强制的说明,在主函数前还是主函数中,都可以,但是为了方便后期的维护与修改,我还是建议放在主函数前,并在声明结构体后马上进行赋值,这样代码的可读性较好

自定义函数

诚然,c语言已经为我们准备好了很多的函数,供我们使用,但是实现特定功能的函数还是需要我们自己定义和编写,下面介绍如何自定义函数。

定义方式

假设我们想要写一个整数加法的函数,那么对于一个函数而言,肯定得有输入吧,不然我怎么得到输出呢,此处假定自定义的函数名为Add,既然得有输入,那么是不是就得写成这样:

Add(int x,int y)

这样此函数就有了输入x和输入y,那么这个函数是干什么的呢,是不是要实现加法运算,所以就需要在该函数内部书写功能:如下:

Add(int x, int y)
{
int z = x + y;
return z;
}

将输入的x和y相加得到和为z,我得到了两个数的和,那我是不是得将他输出出来,不然我怎么知道结果是几,因此此处不是往常的return 0了,

使用方式

在自定义函数完成后,如想使用,直接使用该文件名然后赋予输入值即可吗,如下:

sum = Add(a,b);

其中a和b为输入值,下面为完整代码:

//自定义函数
#include<stdio.h>
int main()
{
    int Add1(int x,int y)
    { 
    int z = 0;
    z = x +y;
    return z;
    }
    int a = 5;
    int b = 6;
    int sum = 0;
    sum = Add1(a,b);
    printf("sum = %d",sum);
    return 0 ;
}

保存编译运行,可以得到以下结果:
在这里插入图片描述
说明程序书写正确,上述即是自定义函数的内容,同时:

注意:自定义的函数必须写在主函数文件内部,不能像结构体一样任意位置均可以,否则报错
2023/05/28 修改:上句话不对,其实只要在使用该函数前声明函数即可,不管是在int main函数内,还是之外

数据占用空间计算

最近我们学习了很多的变量,那么变量的大小究竟是多少呢,在学习本将之前,我们需要对计算机空间的大小有一个基本的了解。

基础知识

比特

在计算机中,最小的计量单位也就是比特了,比特也就相当于一个位置,用来存放二进制数据0或者1,上图:
在这里插入图片描述
上图中的每一个位置都相当于一个比特用来存放数据。

字节

那么一直来用比特来表示和存储数据显然很麻烦,因此,字节产生了,由8个比特组成的就成为一个字节
在这里插入图片描述

千字节

千字节也就就是我们常说的kB了,其中

1kB= 1024B

再高的存储单元如MB,GB,TB等,相邻的单位之间均是1024倍的关系,在此就不一一介绍了,如有需要,自行查询。

数据占用空间计算

在了解了计算机最基本的存储单位后,即可以对我们的变量类型的占用的空间大小进行计算,计算的主要函数 为sizeof函数,想要知道哪个变量的大小直接使用即可,示例代码如下:

int main()
{
    int a = 1;
    double b = 3.14;
    char c = 'm';
    printf("a占用空间为%d\n",sizeof(a));
    printf("b占用空间为%d\n",sizeof(b));
    printf("c占用空间为%d\n",sizeof(c));
    return 0;
}

在上述代码中,我们要计算整型、双精度浮点型、字符型的大小,保存编译可以得到以下的结果:
在这里插入图片描述
每个计算出的结果的单位为字节,由此可以看出,整型的大小为4个字节,双精度浮点型的大小为8个字节,字符的大小为1个字节,结合上述和前一章所学内容,变量a的存储数据则为:

00000000000000000000000000000001

由此可见,计算机是多么的强大。

注意:整型的大小并非一定是4个字节,与此相似的还有指针类型
int 建议为一个机器字长。32位环境下机器字长为4字节,64位环境下机器字长为8字节。

常用的操作符

c语言环境中,有很多很多的操作符,在此处介绍几种较为常用的操作符,其余操作符用到时再进行讲解。

转义操作符

“\”为转义操作符,从名字中可以看出,其转变了原本的意思,比如最常见的,在打印函数中总会用到\n,为什么使用它就可以换行呢,这也就是转移操作符的用处,将一个普通变量n转变为了具有换行功能。

\ddd操作符

\ddd操作符代表着1–3个八进制数,既然是八进制,其只能由0 1 2 3 4 5 6 7这这几个数字组成了,计算如下所占用空间

c:\c_learn:\test.c\667

在计算之前,你自己想一下答案是几呢,数一数,是不是以为是22呢,
由于此处打印的是字符串的长度,打印字符串长度的命令为strlen(string length的缩写)
示例代码如下:

    printf("长度为%d\n",strlen("c:\c_learn:\test.c\667"));

结果如下图所示:
在这里插入图片描述

这是由于\c\t\667由于转义字符\的作用,变为了其他含义,只占用了一个字节,

取地址操作符

其实在前面指针的内容中,已经使用了取地址操作符&,使用该符号可以将数据所在的地址取出

递增递减操作符

如果要进行一个数的递加或者递减操作,可以使用以下操作符,

i++;
i--;
++i;
--i;

两种递增和递减方式有所不同,下面用代码进行阐述:

#include<stdio.h>
int main()
{
    int a = 10;
    int b = 1;
    int c = a++;//先赋值,再加1
    int d = b--;//先赋值,再减1
    printf("c =%d\n d =%d\n",c,d);
    printf("a =%d\n b =%d\n",a,b);
    
    int a1 = 100;
    int b1 = 20;
    int c1 = ++a1;//先加1,再赋值
    int d1 = --b1;//先减1,再赋值
    printf("c1 =%d\n d1 =%d\n",c1,d1);
    printf("a1 =%d\n b1 =%d\n",a1,b1);
    

    return 0;
}

保存编译,结果如下:
在这里插入图片描述
大家可以很清楚看出两种方式的区别,注释中也进行了说明,总结如下:

前置++,先加1,再赋值
后置++,先赋值,再加1

上述内容即为本次的所有内容了,当然了操作符还有很多很多,但并不打算全部讲解,用到的时候再进行讲解,那么多操作符,谁也记不住,哈哈哈哈。
感谢各位朋友的观看,如果方便,可以顺便点个赞和关注呦,谢谢大家!!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器 xiaohu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值