【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://www.mzph.cn/news/582307.shtml

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

相关文章

Redis中RDB和AOF

Redis中RDB和AOF 定时间间隔执行数据集的时间快照&#xff0c;把某一时刻数据和妆容以文件的形式写到磁盘上&#xff0c;也就是快照。 配置文件 如果是普通安装方式可以跳过&#xff0c;如果是docker安装&#xff0c;需要到官网下载redis.conf配置文件到本地&#xff0c;地址…

单挑力扣(LeetCode)SQL题:1951. 查询具有最多共同关注者的所有两两结对组(难度:中等)

题目&#xff1a;1951. 查询具有最多共同关注者的所有两两结对组 &#xff08;通过次数2,464 | 提交次数3,656&#xff0c;通过率67.40%&#xff09; 表: Relations ------------------- | Column Name | Type | ------------------- | user_id | int | | follower_id |…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

深入浅出图解C#堆与栈 C# HeapingVS Stacking第二节 栈基本工作原理 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.cs…

非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (II)

Title: 非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (II) 姊妹博文 非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (I) 非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (II) ⟵ \longleftarrow ⟵ 本篇 非线性最小二乘问题的…

uniapp Vue3 面包屑导航 带动态样式

上干货 <template><view class"bei"><view class"container"><view class"indicator"></view><!-- 遍历路由列表 --><view v-for"(item, index) in routes" :key"index" :class&quo…

听GPT 讲Rust源代码--src/tools(28)

File: rust/src/tools/clippy/clippy_lints/src/operators/identity_op.rs 文件路径 rust/src/tools/clippy/clippy_lints/src/operators/identity_op.rs 中的作用是定义了 IdentityOp 类型的 Clippy lint 规则&#xff0c;用于检查代码中是否存在不必要的恒等操作符&#xff0…

洛谷:线性表

今天开始刷洛谷&#xff0c;之前刷leetcode都是核心代码模式&#xff0c;现在突然让我用ACM模式&#xff0c;刚开始还是很不习惯的&#xff0c;但做了几道题好点了&#xff0c;只能说洛谷题的难度是比leetcode大的。 还有就是&#xff0c;STL牛逼&#xff01; 1.询问学号(vect…

具有权威性的工信部证书怎么考

工信部证书的考试流程如下&#xff1a; 选择正规报考机构&#xff1a;选择一家权威的培训机构或考试中心&#xff0c;确保其具有相应的资质和经验。 提交个人报考资料&#xff1a;根据考试机构的要求&#xff0c;提交相关的个人报考资料&#xff0c;如身份证、学历证明、工作…

【kubernetes】集群网络(一):基础篇

Flannel 1 路由表 & arp & fdb 1.1 路由表 任何网络设备都需要路由表&#xff0c;路由表用来决定&#xff0c;当收到数据包时&#xff0c;该向哪里进行转发。路由表项通常会包含以下几个字段&#xff1a; Destination&#xff1a;目的地Gateway&#xff1a;网关Mas…

【DDD领域驱动篇】如何理解领域驱动设计?

如何理解领域驱动设计? ✔️典型解析✔️扩展知识仓库✔️DDD带来的好处✔️DDD 的不足 ✔️典型解析 领域动设计(Domain-Driven Design&#xff0c;DDD)是一种软件开发方法论&#xff0c;将业务领域作为软件设计的核心&#xff0c;以便更好地满足业务需求。 DDD认为&#xff…

数据结构学习 Leetcode322 零钱兑换

关键词&#xff1a;动态规划 完全背包 记忆化搜索 一个套路&#xff1a; 01背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要逆序遍历完全背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要正序遍历 题目&#xff1a; 方法一&#xff…

【Linux】Linux服务器ssh密钥登录

ssh密码登录 ssh root地址 #需要输入密码ssh密钥登录 Linux之间密钥登录 生成公私钥 #生成公钥私钥 ssh-keygen #默认目录&#xff0c;默认密码空ssh-copy-id #拷贝ID到目标服务器 ssh-copy-id -i id_rsa.pub root192.168.8.22 ssh-copy-id -i id_rsa.pub root192.168.8.33…

把这些软件测试经典面试题!全背下来,拿offer就像喝水一样!

1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容&#xff0c;网络兼容&am…

C语言实验1:C程序的运行环境和运行C程序的方法

一、算法原理 这是学C语言的入门&#xff0c;并不需要很高深的知识&#xff0c;一个hello world 或者一个简单的加法即可 二、实验要求 了解所用的计算机系统的基本操作方法&#xff0c;学会独立使用该系统。 了解在该系统上如何编辑、编译、连接和运行一个C程序。 通过运…

无法连接虚拟机设备 ide1:0,因为主机上没有相应的设备。您要每次在开启此虚拟机时都尝试连接此虚拟设备吗?

Vmware报错&#xff1a; 报错原因&#xff1a; ide1:0一般是虚拟机的光驱&#xff0c;配置选项是“使用物理驱动器”&#xff0c;而宿主机可能没有安装光驱&#xff0c;故无法从驱动器上寻找 .ISO 系统文件。 解决方法: 右键点击对应的虚拟机&#xff0c;再点击“设置”按钮。…

案例195:基于微信小程序的购物商城系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Vue3-27-路由-路径参数的简单使用

什么是路径参数 在路由配置中&#xff0c;可以将【参数】放在【路由路径】中&#xff0c; 从而实现&#xff0c;同一个 路由&#xff0c;同一个组件&#xff0c;因路径参数不同&#xff0c;可以渲染出不同的内容。特点 &#xff1a; 1、当携带不同路径参数的路由相互跳转时&am…

【论文阅读】Realtime multi-person 2d pose estimation using part affinity fields

OpenPose&#xff1a;使用PAF的实时多人2D姿势估计。 code&#xff1a;GitHub - ZheC/Realtime_Multi-Person_Pose_Estimation: Code repo for realtime multi-person pose estimation in CVPR17 (Oral) paper&#xff1a;[1611.08050] Realtime Multi-Person 2D Pose Estima…

Bind for 0.0.0.0:2379 failed: port is already allocated

1、执行命令docker-compose -p docker-apisix up -d 报错 Error response from daemon: driver failed programming external connectivity on endpoint docker-apisix-etcd-1 (2a92a0cefff9194fcd1dad4bdeabf4201d9047ec2633eda455c6e46528668af4): Bind for 0.0.0.0:2379 fa…

NLP论文阅读记录 - 02 | 2022 自动文本摘要方法:综合回顾

文章目录 前言0、论文摘要一、Introduction1.1文本摘要的要求1.2主要研究贡献 二.ATS的分类2.1基于没有。输入文档的数量2.2 基于总结方法2.3 基于输出摘要性质&#xff1a;2.4 基于摘要语言2.4.1 基于摘要算法2.5 基于摘要内容2.6 基于摘要类型2.7 基于概括域2.8 基于加工水平…