C语言基础相关内容

news2024/9/26 3:27:01

文章目录

  • 前言
  • 1. 关键字
  • 2. C语言数据类型
  • 3. 标志符
  • 4. 常量类型
  • 5. 内存模型
    • 变量内存分析
    • 数组
  • 6. printf & scanf
    • puchar&getchar
  • 7 main函数
  • 8 字面值常量


前言

本文简明扼要的介绍了部分C语言的一些基本内容。


1. 关键字

12345678
charshortintlongfloatdoubleifelse
returndowhileforswitchcasebreakcontinue
defaultgotosizeofautoregisterstaticexternunsigned
signedtypedefstructenumunionvoidconstvolatile

基本数据类型:char, int, float, double
类型修饰: short, long, signed, unsigned
复杂类型: struct, union, enum
流程控制:分支(if, else, switch, case, default),循环(for, while, do),跳转(continue, break, goto, return)
存储类型:auto(和c++大相迳庭), register, static, extern, const, volatile
特殊用途:sizeof(同时也是运算符), typedef, void

2. C语言数据类型

基本类型
数值类型
整形, 浮点型, bool
字符
构造类类型
数组, 结构体, 共用体, 枚举
指针
空类型 void

3. 标志符

  • 只能由字符(a~z, A~Z)、数字、下划线组成
  • 不能以数字开头
  • 不能是关键字
  • 区分大小写

个人理解标识符是:顾名思义,标识符就是起到标志作用的符号,是给人用的,编译器会将标志符和地址关联起来;程序的运行并不需要标志符,只需要地址和值,所以标识符是给人和编译器用的。

4. 常量类型

  • 整型常量
  • 实型常量
  • 字符常量
  • 字符串常量

5. 内存模型

在笔者的环境下,不同数据类型的位数

cahrintfloatdoubleshortlonglong longvoid*
Byte14482888

在这里插入图片描述

#include <stdio.h>

void fun();
void fun1();
void fun2();

void fun()
{
    int a = 0x04030201;
    int b = 0x04030201;
    int c = 0x04030201;
    int d = 0x04030201;
    // int *pa = &a;
    printf("fun: \n");
    printf("a = %p\n", &a);
    printf("b = %p\n", &b);
    printf("c = %p\n", &c);
    printf("d = %p\n", &d);
    fun1();
}
void fun1()
{
    int a = 0x04030201;
    int b = 0x04030201;
    int c = 0x04030201;
    int d = 0x04030201;
    int e = 0x04030201;
    // int *pa = &a;
    printf("fun1: \n");
    printf("a = %p\n", &a);
    printf("b = %p\n", &b);
    printf("c = %p\n", &c);
    printf("d = %p\n", &d);
    printf("e = %p\n", &e);
    fun2();
}
void fun2()
{
    int a = 0x04030201;
    int b = 0x04030201;
    int c = 0x04030201;
    int d = 0x04030201;
    // int *pa = &a;
    printf("fun2: \n");
    printf("a = %p\n", &a);
    printf("b = %p\n", &b);
    printf("c = %p\n", &c);
    printf("d = %p\n", &d);
}

int main(int *arg, int **argvs)
{
    int a = 0x04030201;
    int b = 0x04030201;
    int c = 0x04030201;
    int d = 0x04030201;
    // int *pa = &a;
    printf("main: \n");
    printf("a = %p\n", &a);
    printf("b = %p\n", &b);
    printf("c = %p\n", &c);
    printf("d = %p\n", &d);
    fun();

    char* pa = (char*)&a;
    printf("pa= %p\n", &pa);
}

OUT:

main: 
a = 0x7fff04ebfa30
b = 0x7fff04ebfa34
c = 0x7fff04ebfa38
d = 0x7fff04ebfa3c
fun: 
a = 0x7fff04ebf9f8
b = 0x7fff04ebf9fc
c = 0x7fff04ebfa00
d = 0x7fff04ebfa04
fun1: 
a = 0x7fff04ebf9c4
b = 0x7fff04ebf9c8
c = 0x7fff04ebf9cc
d = 0x7fff04ebf9d0
e = 0x7fff04ebf9d4
fun2: 
a = 0x7fff04ebf998
b = 0x7fff04ebf99c
c = 0x7fff04ebf9a0
d = 0x7fff04ebf9a4

pa= 0x7fff04ebfa40

小结:
局部变量在栈空间分配内存时,以函数为单位,先一次性分配出函数内局部变量所需的空间(函数调用不影响函数内局部变量的空间分配), 然后再执行到新的函数调用时由高地址向底地址分配内存

即: 内存的分配以函数为单位由高地址向底地址增长

在这里插入图片描述

变量内存分析

  1. 内存模型是线性的(有序的)
  2. 对于32位机而言,最大的内存地址是 2 32 2^{32} 232(4294967296)(4GB)
  3. 对于64位机而言,最大的内存地址是 2 64 2^{64} 264(171亿GB)
  4. CPU读写内存
    • CPU运行时要明确三件事: 1. 存储单元的地址(地址信息) 2. 器件的选择,读或写(控制信息) 3. 读写的数据(数据信息)
    • 通过地址总线找到存储单元的地址; 通过控制总线发送内存读写指令; 通过数据总线传输需要读写的数据;
  5. 变量的存储原则
    • 内存内配由高地址向低地址增长
    • 变量的首地址是变量存储空间低地址
    • 字节序分为小端(intel, 低地址存储低位)和大端(Motorola, 低地址存储高位); 字节地址内位的存储方式是一致的
      在这里插入图片描述

数组

char arr[3] = {'a', 'b', 'c'};

在这里插入图片描述

不建议使用二维数组, 在C++中使用String来处理字符串

6. printf & scanf

scanf
printf
key board
输入缓冲区
Memory
Memory
输出缓冲区
终端
  • 格式输出函数 printf( “格式控制字符串”, 输出项列表 );
    eg: printf(“a = %d, b = %d”, a, b);
  • 格式控制字符串: %[标志][输出宽度][.精度][长度]类型
类型含义
d有符号十进制
u无符号十进制
f单、双精度浮点数(默认保留6位小数)
c字符
s字符串
p地址
  • scanf函数用于接受键盘输入(STDIN)的内容,是一个阻塞式函数,程序会停在scanf函数出现的地方,直到接受到数据才会继续执行。
  • scanf(“格式控制字符串”, 地址列表);
    eg: scanf(“%d”, &num);
  • 原理
    • 系统会将用户输入的内容先放入输入缓冲区
    • scanf方式会从输入缓冲区逐个取出内容赋值给变量
    • 如果输入缓冲区的内容不为空,scanf会一直从缓冲区中获取,而不要求再次输入
    • 利用setbuf清空缓冲区(所有平台都有效)
      • setbuf(stdin, NULL);

puchar&getchar

char ch = 'a';
putchar(ch);     // 输出a

ch = getchar();  // 获取一个字符

7 main函数

  • main也是个函数名, 只不过该名比较特殊,程序已启动就会自动调用它。即,程序执行的入口。
  • 如果main函数执行正常则返回0, 否则返回一个非0的数
  • int main(int argc, const char* argv[]);
    • argc - 在命令中输入的字符串的个数, 程序名占1个
    • argv - 命令行字符串argv[0]为程序名

8 字面值常量

# 二进制
0b1010
# 十六进制
0xFF
# 八进制
0777
# 十进制
10
# 科学计数法
1e3
1.1e3

45U   # 无符号
34.F  # (float)34.0
2L    # (long)2
2LL   # (long long)2
2ULL  # (unsigned long long)2

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

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

相关文章

【人脸识别】CurricularFace:自适应课程学习人脸识别损失函数

论文题目&#xff1a;《CurricularFace: Adaptive Curriculum Learning Loss for Deep Face Recognition》 论文地址&#xff1a;https://arxiv.org/pdf/2004.00288v1.pdf 代码地址&#xff1a;https://github.com/HuangYG123/CurricularFace 建议先了解下这篇文章&#xff1a…

电子技术——频率补偿

电子技术——频率补偿 在本节我们介绍修改三极点或多极点放大器的开环增益函数 A(s)A(s)A(s) 的方法&#xff0c;使得闭环增益在我们希望的值上放大器是稳定的。这个过程称为频率补偿。 理论 最简单的频率补偿方法是引入新的极点&#xff0c;如图下面是一个放大器的伯德图&am…

windows安装Ubuntu子系统以及图形化界面记录

文章目录1. windows环境设置2. 开始安装3. ubuntu使用3.1 启动和退出 Linux 子系统3.2 安装位置3.3 更换源4. 安装图形化界面4.1 安装VcXsrv4.2 安装桌面环境&#xff08;1&#xff09;方法1&#xff1a;VcXsrv Gnome&#xff08;2&#xff09;方法2&#xff1a;VcXsrv Xfce4…

Python到底牛在哪?现在就业薪资高吗?

Python是什么呢&#xff1f;Python是一种全栈的开发语言&#xff0c;你如果能学好Python&#xff0c;前端&#xff0c;后端&#xff0c;测试&#xff0c;大数据分析&#xff0c;爬虫等这些工作你都能胜任。当下Python有多火我不再赘述,Python有哪些作用呢&#xff1f;据我多年P…

GoogleTest中gMock的使用

GoogleTest中的gMock是一个库&#xff0c;用于创建mock类并使用它们。 当你编写原型或测试(prototype or test)时&#xff0c;完全依赖真实对象通常是不可行或不明智的(not feasible or wise)。模拟对象(mock object)实现了与真实对象相同的接口,但是需要你在运行时指定它…

SpringCloud学习笔记 - Sentinel流控规则配置的持久化 - Sentinel

1. 为什么要将流控规则持久化 默认的的流控规则是配置在sentinel中的&#xff0c;又因为sentinel是懒加载的&#xff0c;只有当我们访问了一个请求的时候&#xff0c;sentinel才能监控到我们的簇点链路&#xff0c;我们才能对该链路进行流控配置&#xff0c;一旦我们重启应用s…

GNN专栏总览

文章目录图卷积神经网络1. 理论篇2. 模型篇3. 有关gnn的论文检索图卷积神经网络 1. 理论篇 原理&#xff1a;http://xtf615.com/2019/02/24/gcn/论文&#xff1a; 综述类&#xff1a; HOW POWERFUL ARE GRAPH NEURAL NETWORKS?Bridging the Gap between Spatial and Spectra…

PHP实现个人免签约微信支付接口原理+源码

什么是个人免签支付 个人免签支付就是给个人用的支付接口&#xff0c;一般的支付接口都需要营业执照才能申请&#xff0c;个人很难申请的到&#xff0c;或者是没有资质去申请&#xff0c;要和支付商进行签约的。免签&#xff0c;顾名思义就是不需要签约。那么个人免签支付就有…

企业数字化运营平台软件开发框架项目

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目录 1 项目总体概述 1.1 项目…

Unity Avatar Camera Controller 第一、第三人称相机控制

文章目录简介Variables实现Target PositionTarget RotationOthers简介 本文介绍如何实现用于Avatar角色的相机控制脚本&#xff0c;支持第一人称、第三人称以及两种模式之间的切换&#xff0c;工具已上传至SKFramework框架的Package Manager中&#xff1a; Variables Avatar&…

51单片机入门 - 简短的位运算实现扫描矩阵键盘

介绍 例程使用 SDCC 编译、 stcgal 烧录&#xff0c;如果你想要配置一样的环境&#xff0c;可以参考本专栏的第一篇文章“51单片机开发环境搭建 - VS Code 从编写到烧录”&#xff0c;我的设备是 Windows 10&#xff0c;使用普中51单片机开发板&#xff08;STC89C52RC&#xf…

Qt编写微信支付宝支付

文章目录一 微信支付配置参数二 支付宝支付配置参数三 功能四 Demo效果图五 体验地址一 微信支付配置参数 微信支付API&#xff0c;需要三个基本必填参数。 微信公众号或者小程序等的appid&#xff1b;微信支付商户号mchId&#xff1b;微信支付商户密钥mchKey&#xff1b; 具…

文件基础IO

目录 前言 用库进行文件操作 文件描述符 理解Linux一切皆文件 缓冲区 认识缓冲区 缓冲区缓冲策略 磁盘结构 磁盘分区 软链接和硬链接 硬链接本质 软连接本质 动态库和静态库进阶 写一个静态库 动态库的产生和使用 动静态库的加载 总结&#xff1a; 前言 在我们了…

SE | 哇哦!让人不断感叹真香的数据格式!~

1写在前面 最近在用的包经常涉及到SummarizedExperiment格式的文件&#xff0c;不知道大家有没有遇到过。&#x1f912; 一开始觉得这种格式真麻烦&#xff0c;后面搞懂了之后发现真是香啊&#xff0c;爱不释手&#xff01;~&#x1f61c; 2什么是SummarizedExperiment 这种cla…

lighthouse的介绍和基本使用方法

Lighthouse简介 Lighthouse是一个开源的自动化性能测试工具&#xff0c;我们可以使用该功能检测我们的页面存在那些性能方面的问题&#xff0c;并会生成一个详细的性能报告来帮助我们来优化页面 使用方式 LH一共有四种使用方式 Chrome开发者工具Chrome扩展Node 命令行Node …

数据结构与算法(一)-软件设计(十七)

设计模式&#xff08;十五&#xff09;-面向对象概念https://blog.csdn.net/ke1ying/article/details/129171047 数组 存储地址的计算&#xff1a; 一维数组a[n]&#xff0c;当a[2]的存储地址为&#xff1a;a2*len&#xff0c;如果每一个数组元素只占用一个字节&#xff0c;那…

Spring Batch 高级篇-分区步骤

目录 引言 概念 分区器 分区处理器 案例 转视频版 引言 接着上篇&#xff1a;Spring Batch 高级篇-并行步骤了解Spring Batch并行步骤后&#xff0c;接下来一起学习一下Spring Batch 高级功能-分区步骤 概念 分区&#xff1a;有划分&#xff0c;区分意思&#xff0c;在…

中国ETC行业市场规模及未来发展趋势

中国ETC行业市场规模及未来发展趋势编辑根据市场调研在线网发布的2023-2029年中国ETC行业发展策略分析及战略咨询研究报告分析&#xff1a;随着政府坚持实施绿色出行政策&#xff0c;ETC行业也受到了极大的支持。根据中国智能交通协会统计&#xff0c;2017年中国ETC行业市场规模…

浅析Linux内核进程间通信(信号量)

信号灯与其他进程间通信方式不大相同&#xff0c;它主要提供对进程间共享资源访问控制机制。相当于内存中的标志&#xff0c;进程可以根据它判定是否能够访问某些共享资源&#xff08;临界区&#xff0c;类似于互斥锁&#xff09;&#xff0c;同时&#xff0c;进程也可以修改该…

FreeRTOS任务基础知识

单任务和多任务系统单任务系统单任务系统的编程方式&#xff0c;即裸机的编程方式&#xff0c;这种编程方式的框架一般都是在main&#xff08;&#xff09;函数中使用一个大循环&#xff0c;在循环中顺序的执行相应的函数以处理相应的事务&#xff0c;这个大循环的部分可以视为…