【C语言】初识C语言

本章节主要目的是基本了解C语言的基础知识,对C语言有一个大概的认识。

什么是C语言

在日常生活中,语言就是一种人与人之间沟通的工具,像汉语,英语,法语……等。而人与计算机之间交流沟通的工具则被称为计算机语言,像C/C++,Java,python…等等。

C语言作为一门通用的计算机编程语言,广泛地应用于底层开发。并不是说C语言不能做应用软件开发,比如早期QQ就是用C语言进行编写的。
在这里插入图片描述

简单介绍一下计算机语言的发展吧,在早期并不存在C语言 ,程序员写代码写出的都是类似 10100101010 等等的一系列二进制序列,在真正使用过程中是极其复杂。因此,渐渐的人们又创造出来用 助记符 来表示不同的二进制序列,例如用PLAY来表示1001,GAME来表示1100,因此就称这种用助记符写代码的方式为汇编语言。后来又发展出来B语言,再到如今的C语言。
在这里插入图片描述
一门语言的好坏以及它的流行程度往往取决于它是否有国际标准。C语言在流行起来后,又出现了C语言在各公司的兼容性问题,鉴于此,在二十世纪八十年代为了避免各开发商用的C语言语法产生差异,美国国家标准总局(ANSI)为C语言制定了一套完整的语法标准,称为 ANSI C。早期公布的 C89 和 C90 都是目前使用最多的标准,至于后来的C99,C11,C17等等并没有被业内广泛接受。

下来介绍下目前大家常用的几款编译器:

苹果公司的 Clang ,Linux系统下的 GCC , VS集成开发环境下的 MSVC 等等一系列编译器。

看到这里可能会有小伙伴有疑问,唉,C语言和编译器有什么关联吗?其实C语言虽然表面上看上去是一行行代码,这代码计算机可不认识,因此C语言本质还是得变成计算机可以识别的二进制指令,那么这里的编译器就起到了将程序员写的C语言代码转换成电脑可以识别的二进制指令的这样一个作用。

第一个C语言程序

main函数是程序的入口,C语言程序是从main函数的第一行开始执行的,在一个项目(工程)中可以有多个 .c 文件,但是在多个 .c 文件中main函数有且仅有一个。

#include<stdio.h>int main()                           //int说明main函数执行后返回一个整型值
{printf("hello world\n");return 0;
}//注意事项:代码中的符号均为英文符号!
基本步骤:
//1.写出main函数
//2.使用printf函数进行打印操作
//  由于printf是一个库函数,因此需要包含对应的头文件--stdio.h
//包含头文件
//按下Ctrl+F5,运行程序

数据类型

写代码是为了人们更加便利的生活,可以说程序离不开日常生活中的各种数据。而把数字、字母和文字输入计算机时,这就使得C语言必须通过一些基本的数据类型对输入的值进行区分和使用不同的数据,因此C语言为程序员提供了两大系列的多种数据类型,接下来我将列出两大数据类型:

  • 整数类型
  • 浮点数(小数)类型

在这里插入图片描述
编辑存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。其中双精度浮点数精度比单精度浮点数更高。浮点数在内存中是无法精确保存的。那这些类型在电脑内存中各占多大一块空间呢,我们可以用sizeof来计算所占内存空间的大小:
在这里插入图片描述
我们可以看到执行结果分别是1,2,4,4,8,4,8,单位为 byte(字节)。 在计算机中存储单元的单位有 bit byte KB MB GB TB PB,那这些单位的到底是多大一块地方呢?我们知道计算机能够识别的是二进制的指令,二进制又是由0和1组成的,那计算机就规定了一个二进制位的大小为1 bit,同时规定了1 bit 是计算机存储数据的最小单位。

  • 1 byte = 8 bit。
  • 1 KB = 1024 byte
  • 1 MB = 1024 KB
  • 1 GB = 1024MB
  • 1 TB = 1024GB​

数据类型是用来创建变量的。

#include<stdio.h>int main()
{//创建一个字符型变量char ch = 'h';  //char类型创建一个变量ch,给ch赋值为h。printf("%c\n",ch);//存放一个人的年龄-10岁int age = 10;   //int类型创建一个变量age,给age赋值为10。printf("%d\n",age);          //存放一个人的薪资float salary = 10000.0f;  //float类型创建一个变量salary,给salary赋值为10000.0f。printf("%.1f\n",salary);printf("%f\n",salary);//计算机默认将小数看作 double 类型,因此在使用 float 类型创建变量时通常在小数后增加 f 。//存放一个人的账户余额double money = 1126.5;  //double类型创建一个变量money,给money赋值为1126.5。printf("%.1lf\n",money);printf("%lf\n",money);return 0;
}//%c - 用来打印字符
//%f - 是打印float类型的浮点数          加 .1  就是保留1位小数
//%lf - 打印double类型的浮点数

变量、常量

生活中的有些值是不变的(比如:性别,身份证号码,血型),有些值是可变的(比如:年龄,体重,薪资)

不变的值在C语言中用常量的概念来表示,变的值在C语言中用变量来表示。

定义变量的方法

#include<stdio.h>int main()
{//类型 变量名 = ***;  int num = 0;                    //初始化:创建变量的同时赋给其一个值printf("%d\n",num);long long ln = 1000;printf("%d\n",ln);double weight = 55.5;printf("%lf\n",weight);return 0;
}

变量的命名

  • 只能由字母(包括大写和小写)、数字和下划线( _ )组成。
  • 不能以数字开头。
  • 长度不能超过63个字符。
  • 变量名中区分大小写的。
  • 变量名不能使用关键字。

这里建议大家在写代码过程中尽量根据功能来选择具有意义的名字。

变量的分类

  • 局部变量
  • 全局变量

区分方法:全局变量在大括号外定义,局部变量在大括号内定义。

#include<stdio.h>int num2 = 1000;     //全局变量int main()
{int num1 = 100;     //局部变量printf("%d\n", num1);printf("%d\n", num2);return 0;
}

当局部变量和全局变量同名冲突的情况下,局部变量优先使用,建议是尽量不要让变量名称相同,出现这种冲突。
在这里插入图片描述

变量的使用

在这里插入图片描述

变量的作用域和生命周期

在这里插入图片描述
在这里插入图片描述
全局变量的作用域是非常广的,甚至可以跨源文件进行使用,需要使用extern进行声明,extern 是用来声明外部符号的。
在这里插入图片描述
生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。

  • 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
  • 全局变量的生命周期是:整个程序的生命周期。

常量

C语言中的常量和变量的定义的形式有所差异。

C语言中的常量分为以下以下几种:

  • 字面常量
  • const 修饰的常变量
  • #define 定义的标识符常量
  • 枚举常量

字面常量:
在这里插入图片描述

const 修饰的常变量:

常变量:const仅仅在语法层面限制num不能被更改,但num本质上还是变量。

在这里插入图片描述

#define定义的标识符常量:

在这里插入图片描述

枚举常量:

枚举意思是指能一一列举,如:性别(男、女、保密),三原色(红色、绿色、蓝色),星期(1,2,3,4,5,6,星期日)。可以自己创建。默认常量对应的值是从0开始,也可自己修改。

在这里插入图片描述

字符串+转义字符+注释

字符串

在C语言中这种由双引号引起来的一串字符称为字符串字面值,简称字符串。

注意:字符串的结束标志是一个 ‘\0’ 的转义字符。在计算字符串长度的时候 ‘\0’ 是结束标志,不算作字符串内容。
在这里插入图片描述

%s是用来打印字符串直到 ‘\0’ 才终止打印。%c是用来打印字符
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6c7a1af696204366a35eddea934fa2ea.png
导致上图情况的原因是:arr2中存有’\0’也就是说有结束标志,所以打印出abc就结束了;而arr1中只有 ‘a’ ‘b’ ‘c’,剩下的元素不明确,因此计算机就随机打印出来一些字符直到打印到 ‘\0’ 为止。

知道真正的原因后,我们就可以很好的解决这个问题,那就是给arr2加上一个 ‘\0’ :
在这里插入图片描述

转义字符

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\’用于表示字符常量’
\“用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1~3个八进制的数字。 如: \130 X
\xdddd表示2个十六进制数字。 如: \x30 0

三字母词:旧的编译器会将 ??)识别为一个字符串,转换成 ] 。因此在旧的编译器上想要打印??)就需要换成 ??) 来达到效果。
在这里插入图片描述
八进制数字130转换为十进制数字后为88,ASCLL码为88的字符是’X’

八进制数字73转换为十进制数字后为59,ASCLL码为88的字符是’;’

十六进制数字35转换为十进制数字后为53,ASCLL码为88的字符是’5’

十六进制数字55转换为十进制数字后为85,ASCLL码为88的字符是U’
在这里插入图片描述
小练习

#include<stdio.h>
//计算下面程序的结果
int main()
{printf("%d\n", strlen("abcdef"));printf("%d\n", strlen("c:\test\628\test.c"));return 0;
}

在这里插入图片描述

注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉
  2. 代码中有些代码比较难懂,可以加一下注释文字

注释有两种风格:

  • C语言风格的注释 /xxxxxx/ 缺陷:不能嵌套注释
  • C++风格的注释 //xxxxxxxx 优点: 可以注释一行也可以注释多行,比较推荐

选择语句

过两天加

循环语句

过两天加

函数

过两天加

数组

过两天加

操作符

过两天加

常见关键字

在这里插入图片描述
C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。

关键字auto

局部变量的特点是:进入作用域自动创建,出了作用域自动销毁。因此局部变量又称为自动变量。

在起初创建一个局部变量时,其数据类型前是有 auto 的。

auto int a = 10;

关键字register

在这里插入图片描述
寄存器关键字只能建议将数据放在寄存器中。

register int num = 100;

关键字typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名,让复杂的类型简单化。

typedef unsigned int uint;typedef struct Node
{int data;struct Node* next;
}Node;int main()
{unsigned int num = 100;uint num2 = 200;return 0;
}

关键字static

static是用来修饰变量和函数的:

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数

修饰局部变量:static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
在这里插入图片描述

在这里插入图片描述

一个普通的局部变量是放在栈区的,而被static修饰的局部变量是放在内存的静态区的。因此static的本质是改变了存储位置。

修饰全局变量:全局变量是具有外部连接属性的,在其他源文件内部适当声明就可以使用,但是一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。否则会在编译的时候出现连接性错误。
在这里插入图片描述

修饰函数:和修饰全局变量类似,一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。在编译的时候会出现连接性错误。
在这里插入图片描述

define 定义常量和宏

定义常量:
在这里插入图片描述
定义宏:
在这里插入图片描述

指针

内存

内存是计算机上的一种存储空间,一般为16/8G。计算机中程序的运行都是在内存中进行的 ,程序如果有数据需要存储,也会申请内存空间。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1byte。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
操作系统一般分为32位或64位,多少位就对应有多少根寻址线,以32位操作系统为例,它对应就有32根寻址线,每一根寻址线都可以通电,电又分为低频和高频,当某一跟线通的是高频时,这根线的二进制表示就是1,同理,通低频时,这根线的二进制表示就是0。
2的32次方对应的就是4G的大小,64次方对应的就是8G的大小
在这里插入图片描述
在计算机中我们喜欢使用十六进制来表示地址,一个十六进制位表示了4个二进制位。

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。取出变量地址如下:

在这里插入图片描述
在这里插入图片描述

如果我们想要存储一个地址,那就需要定义指针变量。
在这里插入图片描述
在这里插入图片描述

我们可以不直接对num进行修改,而是通过其地址p对num进行修改。
在这里插入图片描述

指针变量的大小

指针大小在X86(32位)平台是4个字节,X64(64位)平台是8个字节。
在这里插入图片描述

结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。这就只能使用结构体来描述了。
在这里插入图片描述

在初始化结构体时,必须对应的是上边的结构体定义进行一一对应。
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

.Net FrameWork总结

.Net FrameWork总结 介绍.Net公共语言运行库CLI的组成.NET Framework的主要组成.NET Framework的优点CLR在运行期管理程序的执行&#xff0c;包括以下内容CLR提供的服务FCL的组成 或 服务&#xff08;这个其实就是我们编码时常用到的类库&#xff09;&#xff1a;&#xff08;下…

[Angular] 笔记 12:模板驱动表单 - ngForm

Angular For Beginners - 16. Template Driven Forms (ngForm) Angular 以其表单模块而闻名。 Angular 有两种类型的表单&#xff1a; Template 以及 Reactive&#xff1a; Template 表单的特点&#xff1a;简单&#xff0c;神奇&#xff0c;一键点击。 Reactive 表单的特点&…

echarts中给图表X轴和Y轴加单位以及给tooltip(提示框)增加单位

左边没有单位&#xff0c;右图是增加单位的效果。 1.x轴y轴设置单位 增加单位不管是x轴还是y轴都可以设置name字段&#xff0c;设置完name后效果是红色箭头效果。如果想要蓝色箭头效果可以使用x轴y轴的都有的 axisLabel 属性里面有formatter配置项&#xff0c;formatter支持字…

绝缘电阻测试仪的读数方法有哪些?

绝缘电阻测试仪主要用于测量设备的绝缘电阻&#xff0c;电力工人经常使用它来测试电力设备&#xff0c;从来没有维护过电力设备的正常运行状态。在测试电力设备时&#xff0c;往往需要读取测试结果。绝缘电阻测试仪常用的读数方法有哪些&#xff1f;我一起来盘点一下。 常用的绝…

C语言—每日选择题—Day64

前言 两天没更新了&#xff0c;作者在复习期末考试&#xff0c;更新一波&#xff0c;祝大家都能顺利通过期末考试&#xff01;&#xff01;&#xff01; 指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博…

Python 爬取 哔站视频弹幕 并实现词云图可视化

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境介绍: python 3.8 解释器 pycharm 编辑器 第三方模块: requests >>> pip install requests protobuf >>> pip install protobuf 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命…

C++ DAY1 作业

1.定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;并实现求字符串长度 #include <iostream>using namespace std; namespace myspace {string str;int length_fun(){getline(cin,str);int i 0;while(str[i] ! \0){i;}return i;}} using…

【我与Java的成长记】之this引用和构造方法的使用详解

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、this的使用this引用的特…

Flink1.17实战教程(第二篇:DataStream API)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

Bert模型from_pretrained报网络错误解决办法

问题描述&#xff1a; 服务器或者本地运行以下代码时报网络连接错误&#xff1a; from transformers import AutoTokenizermodel_checkpoint "distilbert-base-uncased" tokenizer AutoTokenizer.from_pretrained(model_checkpoint, use_fastTrue, cache_dir./cac…

使用pytorch搭建ResNeXt并基于迁移学习训练

冻结除最后全连接层以外的所有权重&#xff0c;只去单独训练它最后一层的的权重&#xff0c;这个方法&#xff0c;冻结了所有网络的权重。 for param in net.parameters():param.requires_grad False

Python可视化之Matplotlib

文章目录 Matplotlib与可视化分析简单图形的绘制pylot的高级功能添加图例与注释 Matplotlib与可视化分析 我们之前对数据的处理与分析&#xff0c;其实最终还是要利用可视化工具进行更加直观的输出 我们开业通过 pip install matplotlib命令来安装对应的模块 简单图形的绘制…

2023年山东省高职组区块链技术竞赛任务书

2023年山东省高职组区块链技术任务书 目录 模块一&#xff1a;区块链产品方案设计及系统运维 任务1-1&#xff1a;区块链产品需求分析与方案设计 任务1-2&#xff1a;区块链系统部署与运维 任务1-3&#xff1a;区块链系统测试 模块二&#xff1a;智能合约开发与测试 任务2-1&am…

python 实现粒子群算法(带绘制)

本文章用python实现了粒子群算法&#xff0c; 标准PSO的算法流程如下&#xff1a; 初始化一群微粒&#xff08;群体规模为m&#xff09;&#xff0c;包括随机的位置和速度&#xff1b;评价每个微粒的适应度&#xff1b;对每个微粒&#xff0c;将它的适应值和它经历过的最好位…

Visual Studio使用——自定义代码片段 像使用IDEA一样能快捷输入

目录 引出Visual Studio使用自定义代码片段 Idea安装和使用0.Java下载 和 IDEA工具1.首次新建项目2.隐藏文件不必要显示文件3.目录层级设置4.Settings设置选择idea的场景提示代码不区分大小写 取消git的代码作者显示 总结 引出 Visual Studio使用——自定义代码片段 & 像使…

C++ 一个有bug的贪吃蛇。。。。。。。。

C 一个有bug的贪吃蛇。。。。。。。。 #include <graphics.h> #include<Windows.h> #include<Mmsystem.h> #include<conio.h> #include<time.h> #include<stdio.h> #include<easyx.h> using namespace std; #pragma warning(di…

Google Chrome 现在会在后台扫描泄露的密码

谷歌表示&#xff0c;Chrome 安全检查功能将在后台运行&#xff0c;检查网络浏览器中保存的密码是否已被泄露。 如果桌面用户正在使用标记为危险的扩展程序&#xff08;从 Chrome Web Store 中删除&#xff09;、最新的 Chrome 版本&#xff0c;或者如果启用安全浏览来阻止 Go…

Linux系统安装字体-解决Activiti流程图无法显示问题

1、安装插件 yum install -y fontconfig mkfontscale 2、将字体复制到指定文件夹 (找到Windows系统的C:\Windows\Fonts下找微软雅黑字体【MYYH.TTC】并上传到Linux) cp MYYH.TTC /usr/share/fonts/ 3、执行安装 cd /usr/share/fonts/ mkfontscale mkfontdir 4、刷新缓存 fc-ca…

Java开发框架和中间件面试题(8)

目录 82.Mybatis一级缓存&#xff0c;二级缓存&#xff1f; 83.Mybatis如何防止SQL注入&#xff1f; 84.mybatis中resultType和resultMap有什么区别&#xff1f; 85.如何在SpringBoot中禁用Actuator断点安全性&#xff1f; 86.什么是SpringBoot&#xff1f;SpringBoot有哪些…

为什么都建议配备人员摔倒AI检测算法

旭帆科技的AI智能分析网关v4包含有30多种算法&#xff0c;包括人体、车辆、行为分析、烟火、入侵、安全帽、反光衣等等&#xff0c;可应用在安全生产、通用园区、智慧社区、智慧工地等场景中。 今天&#xff0c;小编就其中的摔倒检测算法来展开聊聊&#xff0c;可以用于哪些场…