C语言扫盲

文章目录

建议还是国外教材学习...人家的PPT比国内的好太多了...

C版本

C90 ->C99-> C11->C17 ->C23

C语言特征

面向过程,编译型语言,源文件后缀.h或者.c, .s为汇编代码

GCC

C语言的编译器,可编译.c文件为二进制可执行文件

文件转化如下

.c

.i

.s

.o

可执行二进制文件

补充:linux 系统下.a文件为静态库文件,.so 为动态库文件。等同于windows 里的.dll 文件

shell 复制代码
//指定用C99的版本编译hello.c文件
$ gcc -std=c99 hello.c

printf

c 复制代码
1.输出占位符
printf("%c is a",'c') //打印字符
printf("%s is a animal","")
printf("%i = 1 ",1) //打印整数
printf("%f",1.24) //打印单精度浮点数
printf("%lf",1.24) //打印双精度浮点数
    int a=1;
    int *p = &a;
printf("%p",p) //打印指针
printf("%zd",sizeof(1))//打印sizeof类型
    
2.限定输出位数
// 输出 hello
printf("%.5s\n", "hello world");

数据类型

unsigned 代表无负数类型,默认signed

char

short,int,long

float和double

char\[\]和 char*="asd"

C里无布尔类型,C99 标准添加了类型_Bool用1表示真,0表示假(实际还是整数类型),后续<stdbool.h> 里定义bool类型,true表示1,false表示0

函数

函数的参数和返回值,会自动转成函数定义里指定的类型。

C语言也是传入的是参数拷贝,如要修改对应内存值,传入内存地址进行操作

指针

c 复制代码
int *p = NULL;
int a=1;
p=&a;

//指针的重要公式
a==*(&a);

hex editor工具调试C代码时可以查看对应16进制内存地址

内存管理

C语言中全局变量存放在堆,用户自行管理,需要手动释放,否则会内存泄漏->OOM

局部变量存在栈里,函数结束后编译器自行释放,内存管理的函数用时再查,不做纪录

-- malloc(), calloc(), realloc(), and free()

void指针

c 复制代码
//void指针可跟其他类型指针转化
int a=1;
void * p=&a;
int *b=p;

Struct结构和Union结构

c 复制代码
struct apple{
    char[] name;
    int index;
} f1


//后写入的属性会覆盖前面的属性,union结构实际只有一个属性
union apple{
    int name;
    double number;
}

typedef

c 复制代码
typedef unsigned char BYTE;

预处理器

#开头

复制代码
#define MD 1 //宏定义
#undef //取消宏定义

/**
*预定义宏,可以直接用
**/
__DATE__:编译日期,格式为"Mmm dd yyyy"的字符串(比如 Nov 23 2021)。
__TIME__:编译时间,格式为"hh:mm:ss"。
__FILE__:当前文件名。
__LINE__:当前行号。
__func__:当前正在执行的函数名。该预定义宏必须在函数作用域使用。
__STDC__:如果被设为1,表示当前编译器遵循 C 标准。
__STDC_HOSTED__:如果被设为1,表示当前编译器可以提供完整的标准库;否则被设为0(嵌入式系统的标准库常常是不完整的)。
__STDC_VERSION__:编译所使用的 C 语言版本,是一个格式为yyyymmL的长整数,C99 版本为"199901L",C11 版本为"201112L",C17 版本为"201710L"。

make工具

通过makefile文件搜索编译配置进行自动化编译的工具,可以只编译有变动的文件然后链接即可,链接比编译快的多

复制代码
foo: foo.o bar.o
  gcc -o foo foo.o bar.o

foo.o: bar.h foo.c
  gcc -c foo.c

bar.o: bar.h bar.c
  gcc -c bar.c

$ make foo.o

# or
$ make bar.o

# or
$ make foo

cmake工具

cmake不是自动化编译工具,是开源的跨平台自动化建构系统,写cmakelist.txt文件生成不同自动化编译工具需要的配置文件如make工具需要的makefile,然后执行make工具进行编译

Project

https://gitee.com/its-ah-xiao/c_project

integral of sinc function

emulator embedded system

an event schedule

补充在线Linux终端

https://copy.sh/v86/?profile=linux26

参考

【1】https://wangdoc.com/clang/

【2】https://www.cse.msu.edu/\~cse251/index.html

相关推荐
云和数据.ChenGuang7 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu7 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
多弗朗皮卡丘8 小时前
C++的IO流
开发语言·c++·io流·文件io流
骑着蜗牛撵大象3278 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
itmigrate8 小时前
Rust 里的所有权误区:不是不写 clone 就叫高性能
开发语言·后端·rust
Brilliantwxx8 小时前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring
摇滚侠9 小时前
《On Java 中文版 基础卷》阅读笔记 初始化和清理 08
java·开发语言·笔记
xiangyun619 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
XiYang-DING9 小时前
P4009.和为K的子数组个数 & P5522.异或和为 k 的子数组个数
java·开发语言
jaysee-sjc9 小时前
【苍穹外卖】Day12:工作台数据看板与 Excel 报表导出
java·开发语言·数据库·spring boot·spring·微信·excel