【C语言】初识C语言

news2025/1/16 5:56:33

本章节主要目的是基本了解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.coloradmin.cn/o/1340692.html

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

相关文章

Android Security PIN 相关代码

开发项目遇到一个问题&#xff0c;具体描述及复制步骤如下&#xff1a; 就是开启"Enhanced PIN privacy"(增强的PIN隐私)的时候输入秘密的时候还是会显示数字 如下图&#xff0c;应该是直接是“.” 不应该出现PIN 密码 想要的效果如下图&#xff1a; 设置的步骤如下图…

给零基础朋友的编程课08 - 代码

给零基础朋友的编程课08 - 旋转、圆弧、初识模块化编程。_哔哩哔哩_bilibili Code: / // 彩色案例 艺术仿制品3 // /// 色表 // // 奶白 215,214,160 // 金黄 187,176,112 // 赭石 96,56,20 // 橙色 218,114,53// 项目设定 size(1000,1000); background(215,214,160); stroke…

C++学习实践(一)高频面试问题总结(附详细答案)

文章目录 一、基础常见面试题1、数组和链表区别2、深拷贝和浅拷贝相关问题的区别3、a和a区别4、c内存模型5、四种强制转换和应用场景 二、指针相关1、指针和引用的区别2、函数指针和指针函数3、传指针、引用和值4、常量指针和指针常量5、野指针6、智能指针的用法 三、关键字作用…

Python跳动的爱心完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…

Python 小程序之动态二位数组

动态二位数组 文章目录 动态二位数组前言一、基本内容二、代码编写三、效果展示 前言 没想出啥好点子&#xff0c;这次就给大家写个小程序&#xff0c;动态二维数组吧。 一、基本内容 程序画一个二维的方格&#xff0c;然后里面填上1-10的随机数&#xff0c;每隔一秒更新新一…

喜讯,思迈特签约南方电网搭建云景数字化运营管控平台

近日&#xff0c;思迈特软件签约南方电网共同搭建云景数字化运营管控平台。 Smartbi将助力云景平台构建“全域协同&#xff0c;全员参与、全员创新”的数字化运营新生态。该平台以“工具数据”赋能基层&#xff0c;充分释放基层“业务人员数字化人员”专业能力&#xff0c;实现…

w4操作系统之windows上创建隐藏用户

隐藏用户–在windows上创建隐藏用户 1.首先查看现有哪些用户。&#xff08;通过net user 命令&#xff09; 2.然后创建隐藏用户&#xff08;net user client$ 123 /add&#xff09; 此时出现报错信息。原因是登录用户没权限。需要用管理员的权限 3.用管理员身份运行cmd&am…

BT321F蓝牙音频主机发射连接TWS耳机回连和主动连接的说明

一、功能简介 很多蓝牙耳机的展架应用&#xff0c;需要蓝牙发射模块&#xff0c;输入音频发送给蓝牙耳机 在蓝牙发射方案BT321F的基础上&#xff0c;增加被TWS耳机或者其他蓝牙耳机回连的应用 解决很多的头戴蓝牙耳机&#xff0c;或者TWS无线蓝牙耳机&#xff0c;每次都要进…

【 YOLOv5】目标检测 YOLOv5 开源代码项目调试与讲解实战(3)-训练yolov5模型(本地)

训练yolov5模型&#xff08;本地&#xff09; 训练文件 train.py训练如下图 一些参数的设置weights:对于weight参数&#xff0c;可以往Default参数中填入的参数有 cfg&#xff1a;&#xff08;缩写&#xff09;cfg参数可以选择的网络模型 data对于data hyp 超参数epochs 训练多…

【Gradio】1、Gradio 是什么

官网&#xff1a;https://www.gradio.app/ 一、Gradio 是什么 Gradio是一个用于创建机器学习模型交互式界面的 Python 库。通过Gradio&#xff0c;可以快速地为模型构建一个可视化的、易于使用的Web界面&#xff0c;无需编写任何Web前端代码。 Gradio 支持多种不同类型的输入…

【信息安全原理】——拒绝服务攻击及防御(学习笔记)

&#x1f4d6; 前言&#xff1a;拒绝服务攻击&#xff08;Denial of Service, DoS&#xff09;是一种应用广泛、难以防范、严重威胁网络安全&#xff08;破坏可用性&#xff09;的攻击方式。本章主要介绍DoS的基本概念、攻击原理及防御措施。 目录 &#x1f552; 1. 定义&#…

无人职守自动安装linux操作系统

无人职守自动安装linux操作系统 1. 大规模部署案例2. PXE 技术3. Kickstart 技术4. 配置安装服务器4.1 DHCP服务4.2 TFTP 服务4.3 NFS服务 5. 示例5.1 搭建server1. 启动dhcp并设为开机自启2. 设置并启动tftp3. 将客户端所需启动文件复制到TFTP服务器4. 创建Kickstart自动应答文…

再谈动态SQL

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 文章目录 专栏精选摘要引言正文动态sql标签ifchoose...when...otherwisewhere、…

0基础学习VR全景平台篇第132篇:曝光三要素—快门速度

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 经过前面两节课的学习我们认识了曝光三要素中的感光度和光圈&#xff0c;这节课我们将一同去了解影响曝光的最后一个要素——快门速度。 (曝光三要素&#xff1a;感光度、光圈、…

记录一下亿级别数据入库clickhouse

需求背景 公司的业务主要是广告数据归因的&#xff0c;每天的pv数据和加粉数据粗粗算一下&#xff0c;一天几千万上亿是有的。由于数据量大&#xff0c;客户在后台查询时间跨度比较大的数据时&#xff0c;查询效率就堪忧。因而将数据聚合后导到clickhouse进行存储&#xff0c;…

Secondo数据库下载安装

SECONDO - An Extensible Database System (secondo-database.github.io) 官网地址 1配置环境 ubuntu20.04.2&#xff08;这个版本不能错&#xff0c;我试了20.04.3就安装不超过&#xff09;&#xff0c;镜像下载地址如下&#xff1a;Index of /releases/20.04.2 2安装步骤 安…

Springboot使用log4j2日志框架

文章目录 1.pom.xml引入依赖2.配置文件引入log4j2的配置文件3.导入log4j2配置文件4.通过Slf4j注解来使用log.info()等最后 1.pom.xml引入依赖 提示&#xff1a;lombok用于Slf4j注解 <dependency><groupId>org.springframework.boot</groupId><artifactId&…

bat命令清理Window应用注册表(Unity开发Window应用)

bat命令清理Window应用注册表&#xff08;Unity开发Window应用&#xff09; 介绍出现的问题方案一方案二方案二解决方案1. 首先使用【Win】【R】组合快捷键&#xff0c;快速打开运行命令框&#xff0c;在打开后面键入命令&#xff1a;【Regedit】2. 完后后按回车键&#xff08;…

异步通知

文章目录 一、异步通知1、应用场景2、执行流程&#xff08;基于读取按键值的情景&#xff09;2.1、应用程序具体做什么&#xff1f;2.2、驱动程序具体做什么&#xff1f; 三、程序1、驱动程序2、测试应用程序 三、总结 一、异步通知 1、应用场景 当应用程序不想休眠时&#x…

[SWPUCTF 2021 新生赛]sql

[SWPUCTF 2021 新生赛]sql wp 输入 1 正常回显&#xff1a; ?wllm1 返回&#xff1a; Want Me? Cross the Waf Your Login name:xxx Your Password:yyy输入单引号引发报错&#xff1a; ?wllm1 返回&#xff1a; Want Me? Cross the Waf You have an error in your SQL s…