C语言基础(一)
C语言基础
- 一、标准输出(格式化输出):
- 1、概念:
- 2、注意语法点:
- 3、格式控制符:
- 4、调试技巧:
- 5、代码风格:
- 6、实例:
- 二、数据类型:
- 1、整型
- 概念:
- 语法:
- 注意:
- 整型的修饰符:
- 整数的存储方式:
- 整型输出:
- 2、浮点型(实型):
- 概念:
- 分类:
- 浮点数的存储:
- 注意:
- 3、字符类型:
- 注意:
- 4、字符串:
- 形式一 数组(可读 ,可写):(存储)
- 形式二 指针 (只读):(指向)
- 5、布尔类型:
- 概念:
- 布尔类型的大小:
- 6、常量与变量:
- 概念:
- 常量类型:
- 7、标准输入:
- 概念:
- 实例:
一、标准输出(格式化输出):
1、概念:
屏幕(终端)对应的就是标准输出的设备文件,如果往该文件中输出内容则可以成为标准输出。
printf();
2、注意语法点:
-
%
必须有的,格式化的开头标记 -
对齐的方式,
-
向左对齐(空格在右) ,如果没有则是向右对齐(空格在左)
-
m.n m指的域宽(需要的字符数), n 指的是精度(默认精度为6)m 的值如果比实际数据小则按实际输出, 反之则用空格来填补
-
l 指的是 long 表示长整型
-
h 指的是短整型
3、格式控制符:
- 十进制的整型:
%d
%md
%ld
%u
(无符号)%lu
- 八进制:
%o
%#o
# --> 输出进制的符号 - 十六进制:
%x
%#x
%#X
- 字符:
%c
- 字符串:
%s
- 单精度浮点:
%f
%.nf
–> n 表示精度 - 双精度:
%lf
- 长双精度 :
%Lf
- 地址:
%p
(字符串输出首字符地址)
printf("%d\n" , 0123 ); // 使用十进制的格式来输出一个八进制数据 0123 ‐‐>83
printf("%o\n" , 0123 ); // 使用八进制的格式来输出一个八进制数据 0123 ‐‐>12
以上语句中 \n
是一个换行符 ,说明是一行的结束
- 标准输出文件中默认使用缓冲 ,也就是当遇到
\n
的时候会进行刷新缓冲区(把数据输出) - 当打印语句后面没有换行符时 , 需要等待缓冲区被装满或者被别的语句刷新或则程序正常退出
4、调试技巧:
printf("%s‐‐%s‐‐%d\n" , __FILE__ , __FUNCTION__ , __LINE__ );
__FILE__ 文件名
__FUNCTION__ 函数名
__LINE__ 行号
5、代码风格:
- 缩进:凡是有代码块的地方必须用缩进,代码块指的是一对大括号 { } 代表一个代码块
- 空格: 标点符号后面,一般加空格
- 空行: 一般在不同的逻辑段落中间加空行
- 符号(变量)命名: 尽可能顾名思义,避免使用无意义的字符 , 不可以使用关键字
6、实例:
int show_bmp(char * Bmp_Path)
{//打开LCDint fd_lcd = open("/dev/fb0", O_RDWR);if (-1 == fd_lcd){perror("open lcd error");return -1;}//内存映射int * p = (int *)mmap( NULL, //由系统自动分配地址800*480*4, //映射区域大小(文件大小) 宽800*高480*LCD一个像素点4字节PROT_READ | PROT_WRITE, // 映射区域可被读取 映射区域可被写入MAP_SHARED , // 对应射区域的写入数据会复制回文件内fd_lcd, //需要映射的文件的文件描述符0); //偏移量if ( MAP_FAILED == p ) // 判断映射是否成功{perror("mmap error");return -1;}//打开BMP图片int fd_bmp = open(Bmp_Path, O_RDWR);if (-1 == fd_bmp){perror("open bmp error");return -1;}
}
这段代码的功能是显示BMP图片。首先打开LCD设备,然后进行内存映射,接着打开BMP图片文件,最后将BMP图片数据写入到LCD设备的内存中。
二、数据类型:
1、整型
概念:
表示整数类型的数据
语法:
int a = 123 ;
注意:
- 整型在 32位系统以及64位系统中都占用 4字节
- 取值范围
getconf INT_MAX
2147483647
getconf INT_MIN
‐2147483648
整型的修饰符:
short
短整型,用于修饰整型的尺寸变为原本的一半,减少内存的开支,缩小取值范围long
长整型 , 用于修饰整型的尺寸使其尺寸变大(取决与系统), 增加内存开支, 扩大取值范围long long
长长整型 , 用于修饰整型的尺寸使其尺寸变大(取决与系统), 增加内存开支, 扩大取值范围 (在64位系统中 long与 long long的大小一致)unsigned
无符号整型 , 用来修饰整型并去掉符号位,使得整型数据没有负数,可以提正整数的取值范围 (0 -4294967295)- 整型数据在二进制存储时最高位(第31位)表示符号位,如果为1 则表示负数反之则表示正数
整数的存储方式:
- 原码: 正整数是直接使用原码进行存储的,比如100这个正整数,则直接把100 转换成二进制直接存储。100 --> 0000 0000 0000 0000 0000 0000 0110 0100
- 补码:负数则是使用补码来存储, 补码 = 原码的绝对值 取反+ 1 取反加1时符号位不变
比如 -100 :
100 --> 1000 0000 0000 0000 0000 0000 0110 0100
取反-> 1111 1111 1111 1111 1111 1111 1001 1011
加1 --> 1111 1111 1111 1111 1111 1111 1001 1100
- 溢出:当超过取值范围时则会编程相邻的最小值/最大值
整型输出:
int c = 100;
printf("十六进制:%#x\n" , c );
printf("十进制:%d\n" , c );
printf("八进制:%#o\n" , c );// 输出结果
十六进制:0x64
十进制:100
八进制:0144
sizeof
运算符,用于计算 变量/类型 的大小
int a = 123 ;
sizeof(int);
sizeof(a);
//注意括号内部可以写变量类型, 也可以写变量名
2、浮点型(实型):
概念:
用来表达一个实数的数据类型
分类:
单精度浮点型 float
, 典型尺寸 4 字节 双精度浮点型 double
, 典型尺寸 8 字节 长双精度 long double
, 典型尺寸 16 字节 占用的内存越多则精度越高
浮点数的存储:
IEEE 浮点标准采用如下形式来表示一个浮点数
注意:
float f = 3.14; // 浮点数3.14 通过以上公式计算得到的二进制码被存放与内存f中
printf("f:%f\n" , f ); // 使用浮点的计算方法来解析内存f中的值(二进制)
printf("d:%d\n" , f );// 直接使用整型的计算方法来直接解析内存f 中的值 (二进制)
所有的数据都会被转换成二进制进行存储,如果想到的到正确的数据,必须使用正
确的理解方式(类型),来解析二进制数据。
3、字符类型:
char c = 'K';
- 申请一片内存并且命名为 c
- 确定内存的大小为 char (1字节)
- 把字符‘K’的ASCII码值转换为二进制,并存储到该内存中
- 计算机中存储的所有数据都是以二进制的形式存在的, 因此字符必须映射某一个数字才能够被存放到计算机中,这个映射的表就成为 ASCII 表,可以使用man手册来查看:
char c = '1' ;
printf("字符:%c\n",c); // 以字符的形式来解析内存 c 的内容得到 对应的字符 1
printf("整型ASCII值:%d\n",c); //以十进制整型来解析内存c 的内容 ,得到1多对应的ASCII值
注意:
字符实质上是一个单字节的整型,因此支持所有整型的操作
char k = 'H' ;
printf("%c\n" , k + 1 );
printf("%c\n" , k ‐ 1 );
4、字符串:
字符串的表现形式有两种:
形式一 数组(可读 ,可写):(存储)
char s1 [] = "Hello" ; //使用一个数组来存放字符串 "Hello"
以上语句其实是把一个字符串常量 “Hello” , 复制到数组 s1 所代表的内存当中
形式二 指针 (只读):(指向)
char * s2 = "Even"; // 使用一个指针来指向常量字符串
#include <stdio.h>
char s1[]="Hello";
char *s2="gee";
int main(int argc,char const *argv[]){printf("%s %s\n",s1,s2);return 0;
}
5、布尔类型:
概念:
布尔类型用来表示真/假 (非零则真)
真: true
假: false
注意在使用布尔类型是需要包含他的头文件: <stdbool.h>
bool a = 1 ; // 真
bool a = 0 ; // 假
bool a = true // 真
bool a = false // 假
一般布尔类型的变量,可以用于逻辑判断比如 if / while
, 或者用于函数的返回值。
布尔类型的大小:
bool a = true ;printf("sizeof(bool):%ld \n ",sizeof(bool) );
printf("sizeof(a):%ld \n ",sizeof(a) );
printf("sizeof(true):%ld \n ",sizeof(true) );
printf("sizeof(false):%ld \n ",sizeof(false) );
printf("false:%d \n ",false );
printf("true:%d \n ",true );//运行结果:
sizeof(bool):1
sizeof(a):1
sizeof(true):4
sizeof(false):4
false:0
true:1
sizeof在C语言中是一个关键字,用于获取对象或类型的存储大小。
在C语言编程中,sizeof是一个非常实用的操作符,它提供了一种计算变量、类型或者表达式在内存中所占用字节数的方式。这个操作符通常被用于优化内存使用,确保数据结构的对齐,以及执行其他与内存管理相关的任务。以下是具体介绍:
- 基本定义
概念理解: sizeof是一个单目运算符
,它返回操作数的存储大小
,单位是字节。重要的是要认识到sizeof
不是函数,因此它的调用方式与函数不同,例如,可以使用形式sizeof int
,而不必加上括号
。
结果类型: sizeof的结果以size_t
类型表达,这是一个无符号整数类型,足以表示任何对象的存储大小。
- 数据类型
基本数据类型: 当sizeof应用于基本数据类型时,如int、char或double,它返回该类型在内存中的字节数。这些大小可能根据不同的系统架构而有所不同。
复合数据类型: 对于数组、结构体和联合体等复合类型,sizeof能够提供整个数据的内存占用大小。这包括所有成员的总和,以及可能的填充字节,以满足特定的内存对齐要求。
- 特殊场景
指针与数组: 尽管指针和数组在某些操作中表现相似,但它们的sizeof结果却大不相同。数组的名称在大多数情况下代表整个数组的大小
,而指针仅代表指针本身的大小的字节数
。
函数与参数: 当sizeof应用于函数时,由于函数类型在C语言中被视为不完全类型,因此结果通常是不准确的。同样,当数组作为函数参数传递时,它们会退化为指针,此时sizeof将返回指针的大小而非数组本身的大小。
- 应用案例
动态内存分配: 在利用malloc或相似函数进行动态内存分配时,sizeof帮助确定需要分配的内存量,从而避免内存溢出或浪费。
数据验证: 通过比较预期的数据结构大小与实际计算的sizeof结果,可以检测数据结构的配置错误或内存对齐问题。
- 注意事项
编译器相关: 不同的编译器和不同的目标系统可能对同一数据类型提供不同的大小。程序员在使用sizeof时应考虑到这一点,特别是在写跨平台代码时。
使用误区: 由于sizeof不是一个函数,因此不应在其后面加上函数调用所需的括号。虽然加上括号在某些情况下仍然合法,但这可能会导致混淆。
综上所述,sizeof在C语言中的应用非常广泛,从简单的数据类型检查到复杂的内存管理任务,都是一个不可或缺的工具。掌握其细节能够帮助开发者更好地优化程序性能和资源使用。
6、常量与变量:
概念:
不可以被改变的内存,被称为常量,可以被改变的内存则成为变量
int a = 100 ; // a是一个变量, 而 100 则是常量
float f = 3.1415; // f 是一个变量, 而 3.1415 则是常量
char s1[] = "abcdefg" ; // s1 是一个变量 , 而"abcdefg" 则是常量 (字符串常量)
常量类型:
- 100 : 整型常量
- 100L : 长整型 long
- 100LL : 长长整型 long long
- 100UL : 无符号的长整型 unsigned long
- 3.14 : 编译器默认升级为双精度浮点型
- 3.14L : 长的双精度浮点型
- ‘a’ : 字符常量
- “Hello” : 字符串常量(指针 char * )
7、标准输入:
概念:
标准输入一般指的是键盘的设备文件, 从键盘获取数据就成为标准输入
//头文件:
#include <stdio.h>
scanf( ); // 扫描键盘 (格式化输入数据 ‐‐> 从键盘中获得指定类型的数据)
//函数原型:
int scanf(const char *format, ...);
//参数分析:
//format ‐‐> 格式化
//... ‐‐> 省略号 , 根据format 所写的格式控制符,对应一个内存地址
//返回值:
//成功 返回具体获取到的项目数
//失败 返回0
getchar( ) ; // 获取一个字符 (默认从标准输入文件中获取)
//函数原型:
int getchar(void);
//参数:
//无
//返回值:
//成功 返回一个ASCII值, 代表获得的字符 (unsigned char )
//失败 返回 EOF 也就是 ‐1
#include <stdio.h>int main(int argc, char const *argv[])
{
int num = 0;
char c = '0';
// & 取地址符号 , 获得 内存 num 的地址
int ret_val = scanf("%d", &num );
while(getchar() != '\n'); // 清空 由 scanf 所留在缓冲区的内容
// 如果不清空有可能会导致下一次使用标准输入缓冲区异常(有上一次的数据没有被读取)printf("返回值:%d , 获取的数据为:%d\n" , ret_val , num );ret_val = scanf("%c", &c );
while(getchar() != '\n'); // 清空 由 scanf 所留在缓冲区的内容
printf("返回值:%d , 获取的数据为:%c\n" , ret_val , c );printf("EOF:%d\n" , EOF ); //EOF 实际上是一个值为‐1 的宏return 0;
}
实例:
注意:
如果以后需要从标准输入中获取数据得到乱码或未知数据,则可以尝试使用getchar
进行清空再 获取。
相关文章:

C语言基础(一)
C语言基础 一、标准输出(格式化输出):1、概念:2、注意语法点:3、格式控制符:4、调试技巧:5、代码风格:6、实例: 二、数据类型:1、整型概念:语法&a…...
机器学习_决策树与随机森林
决策树是一种常用的监督学习算法,既可以用于分类任务也可以用于回归任务。决策树通过递归地将数据集划分成更小的子集,逐步建立树结构。每个节点对应一个特征,树的叶子节点表示最终的预测结果。构建决策树的关键是选择最佳的特征来分割数据&a…...
嵌入式系统日志轮转:实现与性能考量
日志轮转是嵌入式系统中管理日志文件的一种常用技术,它通过创建新的日志文件来替代旧的日志文件,从而避免日志文件无限增长,占用过多存储空间。本文将探讨日志轮转的实现方法以及在嵌入式系统中实现日志轮转时需要考虑的性能因素。 一、日志…...

麦肯锡:ChatGPT等生成式AI应用激增,大中华区增长最快
全球顶级咨询公司麦肯锡(McKinsey & Company)在官网发布了《he state of AI in early 2024:Gen AI adoption spikes and starts to generate value》,一份关于生成式AI应用的调查报告。 麦肯锡对多个国家/地区的1,363位管理者进行了调查…...
Vue Router 使用教程
Vue Router 是 Vue.js 的官方路由管理器,它提供了一种方便的方式来管理应用的路由。在本教程中,我们将介绍 Vue Router 的一些常见用法和示例。 一、安装 Vue Router 使用 Vue Router 之前,需要先安装它。可以使用以下命令通过 npm 安装&am…...
银河麒麟解压命令
银河麒麟(Kylin)操作系统是基于Linux的操作系统分支之一,其使用的解压命令与Linux系统中的命令基本相同。 在银河麒麟系统中,常用的解压命令有以下几种: 对于.tar文件: tar -xvf file.tar对于.tar.gz或.…...
VSCode打开文件总是在当前标签页打开,不是新增标签页
修改 VS Code 设置 打开设置: 按 Ctrl , 或者点击右下角的齿轮图标,然后选择 “Settings”。 搜索设置: 在设置搜索栏中输入 workbench.editor.enablePreview。 禁用预览模式: 找到 Workbench > Editor: Enable Preview 选…...

Django redirect()函数实现页面重定向
1,通过路由反向解析进行重定向 1.1 添加视图函数 myshop/app2/views.py from django.http import HttpResponse from django.shortcuts import render from django.urls import reverse def index(request):return HttpResponse("app2 的index")# 反向…...
【运维项目经历|029】NTP精准时间同步系统优化项目
🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目...
机房网络运维服务项目难点与关键点分析
随着信息技术的飞速发展,机房作为支撑企业信息化建设的核心枢纽,其网络运维服务的重要性日益凸显。然而,在实际运维过程中,运维团队常常面临诸多难点和挑战。本文将围绕机房网络运维服务项目的难点和关键点进行深入分析࿰…...

MKS AX7680 SERIES 电源使用说明手侧
MKS AX7680 SERIES 电源使用说明手侧...

DVWA-XSS(Reflected)
反射型XSS可以用来窃取cookie Low 输入1111进行测试,发现1111被打印 输入<script>alert(document.cookie)</script>,出现弹窗,获得cookie Medium 查看后端代码,发现对<script>进行了转义,但是…...

Python自动化办公2.0 即将发布
第一节课:数据整理与清洗 第二节课:数据筛选、过滤与排序 第三节课:高级数据处理技巧 第四节课:数据可视化与实践案例 第五节课:统计分析与报表 第六节:常见的Excel报表 与下方的课程形成知识体系&…...
【面试宝藏】Redis 常见面试题解析其二
Redis 高级面试题解析 20. 说说 Redis 哈希槽的机制? Redis 集群采用哈希槽(Hash Slot)机制来分布和管理数据。整个哈希空间被划分为 16384 个槽,每个键通过 CRC16 校验后取模映射到一个哈希槽。每个节点负责一部分哈希槽&#…...

智慧公厕厂家+智能厕所小程序,构建数字化公厕新体系
在现代社会的诸多场景中,公厕扮演着重要却常常被忽视的角色。尤其是在传统的楼宇中,公厕存在着一系列痛点问题。 一、传统公厕问题 传统楼宇公厕常常面临着布局不合理的困境,导致使用者寻找困难,浪费时间和精力。卫生状况也是一大…...

使用迁移助手 (SSMA for Oracle) 将Oracle19c数据库迁移到SQL Server2022
如何使用适用于 Oracle 的 SQL Server 迁移助手Microsoft SQL Server Migration Assistant for Oracle (SSMA for Oracle) 将 Oracle 数据库迁移到 SQL Server Microsoft SQL Server Migration Assistant (SSMA) for Oracle is a tool to automate migration from Oracle data…...

LabVIEW开发EOL功能测试系统
LabVIEW开发EOL功能测试系统 介绍了一种基于LabVIEW开发的EOL功能测试系统方案,涵盖软件架构、工作流程、模块化设计、低耦合性、易于修改与维护、稳定性及硬件选型。系统通过高效的CAN通信实现对电机控制器的全面测试,确保运行可靠并支持未来的升级需求…...
Java finally catch try关键字
Java finally catch try关键字 finally: finally 关键字用来创建在 try 代码块后面执行的代码块;无论是否发生异常,finally 代码块中的代码总会被执行。 在 finally 代码块中,可以进行文件流关闭等收尾善后性质的语句 catch&am…...
docker安装mysql8和mysql5.7
1.docker安装mysql5.7,请点击此链接 2.docker安装mysql8并挂载数据卷 docker pull mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORDmy-secret-pw -d mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORD123456 -v /mqq/mysql8/datadir:/var/lib/mysql -d…...
通过一个例子,说明Python的责任链设计模式有什么优缺点
责任链设计模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将一个请求沿着处理者链进行传递,直到有一个处理者处理它为止。在Python中,这种模式可以通过多种方式实现,通常涉及到一系列对象…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...