[C语言]深入浅出,带你构建C语言宏观框架

导言:
本文章会带你基本了解C语言,对他有一个感性的认识,对其有一个框架,后期在对其进行更加细致的补充。


文章目录

  • C语言
  • 第一个函数
  • 变量
    • 局部变量 与 全局变量
    • 常量
    • 字符串 与 转义字符
  • 头文件
  • 分支 与 循环
  • 注释
  • 数组
  • 关键字
  • 操作符
  • 指针


C语言

C语言是啥呢?

C语言就是人和机器交流的语言,早起人与计算机交流使用2进制(科研人员),后面在简化有了汇编(部分极客),在有了B语言,C语言(大众普及),到现在C++/java…,C语言就是一个编程语言与计算机沟通实现你的想法的语言


第一个函数

在C语言/C++中一般在IDE(集成开发环境)中创建项目都会默认出现下面的代码

int main()
{return 0;
}
//或者是
int main(int argc,char *argv[])
{return 0;
}
//这里的argc 和  argv是命令行参数,argc是有多少个指令 argv就是指令啦,挖坑。

或许有人第一次见到会有这样的疑惑:这是啥?有啥用?能吃吗?疑问3连。幸好你遇到了我,解释如下:

main 函数是程序得入口,也就是运行的必经之路。你或许以为他就是这样,但是他还有许多的坑或者说细节:一个项目中只能有一个main函数,一个项目只能有一个main函数,一个项目只能有一个main函数重要的事情说三次,如果你写了多个会咋样
在这里插入图片描述
那当然是报错喽,运行不起来。

介绍下函数的:
在这里插入图片描述


变量

变量简单来说就是用来存储数据的,且变量的类型不止一个,有内置类型,和自定义类型。那你或许会问为啥需要类型,如果抽象成现实生活中事情,那就是买房子,每个人的需求不一样买的房子也不一样,但是造房子有对应的户型,当然是你也可以买地皮自己造.......当然计算机也是创建变量本质也就是向内存申请空间

//内置类型 // sort(短整型)、int(整型)、long(长整型)、long long(长长整型) 、char(字符型)、float(单精度浮点型)、double(双精度浮点型)
//sizeof是一个关键字,也是一个操作符,计算变量的大小(字节)
printf("%d",sizeof(short)) //sort 和short int  result: 2字节
printf("%d",sizeof(int)) // result:4
printf("%d",sizeof(long)) // result:4 
printf("%d",sizeof(long long)) //result:8 
printf("%d",sizeof(char)) //result:1
printf("%d",sizeof(float)) //result:4
printf("%d",sizeof(double)) //result:8//自定义类型//struct 所定义的变量,现在感性理解他就是内置类型的集合体//union 联合体//变量类型大小涉及到特殊存储规则,挖坑

有人会问为啥用的是字节呢?字节是啥?

如图所示计算机的单位与换算:
在这里插入图片描述
那么为啥是字节呢?
因为计算机只识别0101的二进制序列,那数据存储也是以二进制存储到内存中,那么按照上图所示,当然是字节为好,byte少了kb又太多,你想一个栈区(变量等存放的地方)也就4mb(看操作系统),如果kb的话工程大都不够创变量了~


拓展ASCII表
在这里插入图片描述

局部变量 与 全局变量

简单理解,看作用域(就是变量可以使用的范围),或者说生命周期(就是变量创建到销毁的范围)如下代码

int global; //全局变量
int main()
{int local;//局部变量 return 0;
}//全局变量:从创建到程序结束才释放
//局部变量:从创建到花括号/大括号({})结束,但是可以用static修饰导致他出了作用域爷不会销毁,挖坑

有趣的例子/特性

#include<stdio.h>int a =1;
int main()
{int a = 2;printf("%d",a);return 0;
}

那你觉得答案是:(1,2)呢?
如果你选的是2那么恭喜你选对了,那为啥呢?既然你真心诚意的问了,我就大发慈悲的告诉你吧。这个就是局部优先的原则,全局变量和局部变量重名时局部优先。但是我不建议你在平时写这样的代码,不过这个会在题目中出现,插个眼。

常量

人如其名,创建后就不能改变,如果改了则会报错,在C语言中有以下方式创建

#include<stdio.h>
int main()
{//1.字面常量10;//2. const所修饰的常变量,后面和指针数组结合会有奇怪的化学反应const int a;  int const a; //俩者一致//3. 宏定于的标识符常量#define MAX 100;return 0;//4.枚举类型就是一一可以列举的值,可以理解给数字起名字,如下代码Read默认从0开始后面依次递增,也可以赋值赋值后已赋的常量为起点依次递增enum 类型{Read,Green,Blue	}	
}

不知道你是否有个疑问那就是别的都是常量,为啥const修饰的叫做常变量呢?

//在C11标准之前创建数组只可以用常量,数组就是同类元素的集合
const int count = 10;
int arr[count]; //这样就会报错

字符串 与 转义字符

字符串就是一串由 一对双引号所引起的多个字符(“ ”),且字符串的终止表示就是\0,如下所示
资源管理器验证:
在这里插入图片描述

用代码验证

在这里插入图片描述
从sizeof那里可以看出a2比a1多一个元素,但是你看strlen的字符串长度a2远比a1长,strlen也是以\0位终止,没有则会一直找\0

转义字符:

在这里插入图片描述


头文件

不知到大家在用printf 和 scanf (输入,输出库函数) 的时候有没有想过为啥要引用头文件呢?

库函数就是使用频率非常高,则官方自己实现方便我们使用。
为啥要引用头文件,因为当你在编译的时候会自动吧头文件中所包含的代码(库函数)全部拷贝到当前文件。

拓展

// 当你使用函数的时候是从上往下查找的后实现的代码写到下面去如下所示
int add(int x , int y);int main()
{	prinft("%d",add(10,20));
}
int add(int x , int y)
{return x+y;
}

分支 与 循环

在日常生活中我们一直都在选择和重复做某事,当然在编程中选择就是分支,重复就是循环,使用如下代码

// 分支//单分支 if/else if/ else//多分支 switch
if(条件)//条件真则执行语句1语句1;
else//条件假执行语句2语句2;if(条件1)//条件1真则执行语句1语句1;
else if(条件2)//条件1假且条件2真则执行语句2语句2;
else//条件1且条件2都是假则执行语句3语句3;//当switch的值和case值一样时则执行对应的语句,如果都不满足且有default则执行default中的语句
switch()
{case1:语句1;case2:语句2;		case3:语句3;default:语句4;
}
//循环//whilewhile(条件) //当条件满足时会一直循环执行语句不满足时候则退出循环{语句;}//for:一般用于已经知道循环多少次for(变量;条件;退出条件){语句;}do{语句;}while)(条件); //do while无论条件是否满足都会执行语句 

循环和分支都可以使用的关键字:

  1. continue 执行到这个语句则会跳过这次循环,也就是他的下面的代码就不执行了
  2. break 直接跳出循环
int main()
{for(int i=0;i<10;i++){if(i ==5){continue;}printf("%d ",i);}//result:0 1 2 3 4 6 7 8 9for(int i=0;i<10;i++){if(i ==5){break;}printf("%d ",i);}//result:0 1 2 3 4	
}

注释

在学编程有一个梗,我最讨厌的写注释和别人不写注释。那注释的用处是啥呢? 就是给你和别人理解代码。C语言注释的方式

  1. //
  2. /**/,这个方式不太推荐因为他不能嵌套使用

在这里插入图片描述

/**/的好用技巧:当你实现了一个函数时企且有许多参数时,你可以这样给参数进行注释:

int add(int x/*参数1*/,int y /*参数2*/)
{return x+y;}
int main()
{add(10,20);
}

数组

同类型的一组变量的集合,语法如下

// 类型 + 数组名 + [数组变量个数]  = {数据}
int arr[10];

特殊的语法:在C11版本之前的版本数组创建定义个数一定要是常量,不可以是变量,一定要是常量

请问如何访问 和 给变量放入变量呢?

//[](下标访问操作符) 或者 *数组名+值
//注意,下标是从0开始的一定要记住,不然就越界访问了
int arr [10];
for(int i =0;i<=10;i++)
{arr[i] = i;printf("%d ",arr[i]);//result:0 1 2 3 4 5 6 7 8 9
}for(int i =0;i<=10;i++)
{printf("%d ",arr+i);
}

关键字

在C语言中有许多关键字,就是赋予特殊作用的字符,如下:
在这里插入图片描述

static的作用

  1. 修饰局部变量
//static 会改变局部变量的生命周期
int fun1()
{int a = 0;a++;printf("%d ",a);
}int fun2()
{static int a = 0;a++;printf("%d ",a);
}int main()
{for(int i =0;i<3;i++)fun();
}
//result fun1: 1 1 1
//result fun2: 1 2 3

在这里插入图片描述

  1. 声明全局变量 和 函数
    声明后只可以在本.c文件中使用,一般情况在同一个项目文件中只要声明后别的.c文件就可以使用(extern)
    在这里插入图片描述

但是或许会有这样的场景,在多人开发时A1写了个add的函数但是他的功能是俩数相加在加1,A2后面在开发别的功能想要用add函数但是他想要的就是简单的俩数相加,他偷懒声明看看有没有如果有,那么这不就出大麻烦了嘛,所以static修饰一下则可以避免这样的乌龙。
在这里插入图片描述

操作符

在这里插入图片描述

//算数操作符printf("加:%d",1+2); //3printf("减:%d",1-2); //-1printf("乘:%d",1*2);//2printf("除:%d",1/2);//0printf("取模:%d",1%2);//1,取余数
//除法在这里是向下取整,并不是小数,但是只要除数和被除数其中一个是小数则结果也是小数
//取模俩边一定是整数不然会报错//移位操作符(移动的是存储的二进制位,如上所述每个值在底层存储都是以二进制存储的,然后其实简单理解就是二进制位向左/右移动)printf("左移:%d",1<<2); //2printf("右移:%d",1>>2); //0
//8进制位例子00000001 >> 1 = 00000000	//位操作符
printf("加:%d",1&1);// 1,对应的二进制位都是1时则保留,其余都为0
printf("加:%d",1|0); //1,对应的二进制位只要一个是1就为1
printf("加:%d",1&0); //0,对应的二进制位不同时则保留
//8进制位例子00000001			   | 00000001&	--->000000000  |		&    --->0000000000000001			   | 00000000		//单目操作符
printf("! %d",!0001); // 0 ,逻辑反,非零数值变零,零变1
printf("sizeof %d",sizeof(int)); // 4,计算大小,也就是字节数
printf("前后置++/-- %d",++1); //2 就是自增或者自减,后置则为 1 先输出在加减
printf("~%d" ,~0001);//-2,全部二进制位取反
int a =10;
printf("& %p",&a);//0xadada 取地址,取出a在内存中的地址/编号 
printf("* %d",*(&a)); //10 解饮用,就是拿着地址去找对应的值//逻辑操作符
printf("&& 与 %d",1&&1); // 1 ,逻辑与,操作符俩边都要是真的则为真
printf("|| 或 %d",1||0); //0 ,逻辑或,操作符俩边只要一个是真的则为真//条件操作符/三目操作符
printf("%d",1>2?1:2); // 2 ,语法格式 a>b:a:b a>b真则为a反之b

其实就是用#define定义的函数,一般都是常用简短的函数.

#define ADD(X,Y) X+Y
int add(int x,int y)
{return x+y;
}
int main()
{printf("%d",add(1,1)); // 2printf("%d",ADD(1,1));// 2
}

虽然他们的结果都是一样,但是宏的效率更高,那是为啥呢?
在这里插入图片描述

指针

拓展:内存(简单理解)
在这里插入图片描述

如上所述,创建变量就是向内存申请一块空间,那么你想如何在内存中找到你的变量呢?

那就是给内存划分为1字节大小的区域并且给他编号,就如同家的门牌号

如何创建和使用一个指针呢?

//类型 * 变量名
int a =10;
int *pa = &a;// pa此时存的就是a的地址printf("%d",*pa);//用解引用操作符则可以找到a的值

那么一个指针大小是多少呢?

printf("%d",sizeof(int *));
printf("%d",sizeof(char *));
printf("%d",sizeof(short *));
//结果都是4

为啥结果都是4字节呢?

这个就是电脑位数有关了,如果你是32位的电脑则电脑有32根地址,每根地址线通电则会产生0/1俩中结果,那么32个位来表示地址的话那么刚好就是4字节,对应的64位就是8字节

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/85261.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS + Qt Include宏指向的路径错误或者project特性的值无效

如果你电脑上有多个Qt版本&#xff0c;不同项目又依赖不同的Qt版本&#xff0c;就会偶尔出现Qt Include宏指向的Qt路径并不是当前依赖的Qt路径。有时候还会出现project特性的值无效&#xff0c;路径中含有非法字符错误&#xff0c;如下图所示 这个问题的解决办法就是删除工程目…

Docker容器监控(Cadvisor +Prometheus+Grafana)

环境部署&#xff0c;接着上一篇文章Docker容器部署&#xff08;Cadvisor InfluxDBGrafana&#xff09;开始 目录 1、先清理一下容器 2、部署Cadvisor 3、访问Cadvisor页面 4、部署Prometheus 5、准备配置 6、运行prometheus容器 7、访问prometheus页面 8、部署Grafan…

软件测试面试题——如何测试App性能?

为什么要做App性能测试&#xff1f; 如果APP总是出现卡顿或网络延迟的情况&#xff0c;降低了用户的好感&#xff0c;用户可能会抛弃该App&#xff0c;换同类型的其他应用。如果APP的性能较好&#xff0c;用户体验高&#xff0c;使用起来丝滑顺畅&#xff0c;那该应用的用户粘…

Spring IoC 详解

目录 一、引言二、Spring Bean三、将一个类声明为 Bean 所涉及的注解四、Component 和 Bean 的区别五、注入 Bean 的注解六、Autowired 和 Resource 的区别七、Bean7.1 作用域7.2 线程安全7.3 生命周期 一、引言 IoC&#xff08;Inversion of Control:控制反转&#xff09; 是…

【01】基础知识:typescript安装及使用,开发工具vscode配置

一、typescript 了解 typeScript 是由微软开发的一款开源的编程语言。 typeScript 是 javascript 的超级&#xff0c;遵循最新的 es6、es5规范。 typeScript 扩展了 javaScript 的语法。 typeScript 更像后端 java、C# 这样的面向对象语言&#xff0c;可以让 js 开发大型企…

CANdelaStudio 使用介绍

CANdela Studio使用_哔哩哔哩_bilibili 一.CANdelaStudio使用tips 1.开始菜单打开软件&#xff0c;避免软件字体是德文的 2.打开软件之后&#xff0c;用“Open”打开.cdd或者.cddt文件&#xff0c;不要双击文件打开&#xff0c;这样容易报错 3.查看软件版本信息 4.只有Admin版…

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型&#xff0c;包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例&#xff0c;以…

灰度均衡变换之c++实现(qt + 不调包)

1.基本原理 灰度均衡是以累计分布函数变换为基础的直方图修正法&#xff0c;它可以产生一副灰度级分布概率均匀的图像。也就是说&#xff0c;经过灰度均衡后的图像在没一级灰度上像素点的数量相差不大。公式见下图&#xff0c;为灰度值为x的像素点的个数&#xff0c;n为总像素点…

回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门…

十一、结合数字孪生与时间技术进行多维分析设计与实施

大数据可视化中心以主题为分析对象,选择业务分类下的某个主题,可以在数据面板中展示其二维图表,在地图中标记其空间分布,并叠加其相应的二维或三维图层。 1、界面设计 其主界面设计详上图,各部分功能介绍如下: 1.1、主题与图层面板,从上到下,从左到右分别是: ①折…

高压放大器如何正常使用的呢

高压放大器是一种用于将低电压信号转换成高电压信号的电子设备。它广泛应用于通信、雷达、医疗设备等领域。正确使用高压放大器对于保证设备的正常运行和延长使用寿命至关重要。下面安泰将介绍高压放大器的使用方法和注意事项&#xff0c;帮助您更好地了解如何正确使用高压放大…

Python基础小项目

今天给大家写一期特别基础的Python小项目&#xff0c;欢迎大家支持&#xff0c;并给出自己的完善修改 &#xff08;因为我写的都是很基础的&#xff0c;运行速率不是很好的 目录 1. 地铁票价题目程序源码运行截图 2. 购物车题目程序源码运行截图 3. 名片管理器题目程序源码运行…

使用vscode远程登录以及本地使用的配置(插件推荐)

1、远程登陆ssh 1.1打开vscode插件商店&#xff0c;安装remote-ssh插件 远程ssh添加第三方插件&#xff1a;vscode下链接远程服务器安装插件失败、速度慢等解决方法_vscode远程安装不上扩展_Emphatic的博客-CSDN博客 转到定义&#xff0c;选中代码->鼠标右键->转到定义…

基于Java+SpringBoot+Vue的数码论坛系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Mongodb 安装

一、win10安装 服务端下载地址&#xff1a;Download MongoDB Community Server | MongoDB shell 工具下载地址&#xff1a;MongoDB Shell Download | MongoDB 服务端安装时选择custom&#xff0c;否则安装文件没有bin目录。 将安装后的文件中的bin目录加到环境变量。 设置…

CAD转kml插件acad2kml分享下载

KML&#xff08;Keyhole Markup Language&#xff09;是一种用于描述地理数据的格式&#xff0c;它由Google公司开发并在2008年成为开放标准。KML使用XML语法&#xff0c;可以用于表示地理点、线、多边形、图像覆盖物以及相关属性信息。 KML是一种用于描述地理数据的开放格式&…

sklearn中使用决策树

1.示例 criterion可以是信息熵&#xff0c;entropy&#xff0c;可以是基尼系数gini # -*-coding:utf-8-*- from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split wineload_wine()# print ( wine.feature_…

【uniapp】uniapp打包H5(网页端):

文章目录 一、设置appid&#xff1a;二、设置router&#xff1a;三、打包&#xff1a;【1】[CLI 发行uni-app到H5&#xff1a;https://hx.dcloud.net.cn/cli/publish-h5](https://hx.dcloud.net.cn/cli/publish-h5)【2】HBuilderX 四、最终效果&#xff1a; 一、设置appid&…

(三)Node.js - 模块化

1. Node.js中的模块化 Node.js中根据模块来源不同&#xff0c;将模块分为了3大类&#xff0c;分别是&#xff1a; 内置模块&#xff1a;内置模块由Node.js官方提供的&#xff0c;例如fs、path、http等自定义模块&#xff1a;用户创建的每个.js文件&#xff0c;都是自定义模块…

Flink-串讲面试题

1. 概念 有状态的流式计算框架 可以处理源源不断的实时数据&#xff0c;数据以event为单位&#xff0c;就是一条数据。 2. 开发流程 先获取执行环境env&#xff0c;然后添加source数据源&#xff0c;转换成datastream&#xff0c;然后使用各种算子进行计算&#xff0c;使用s…