
C Primer Plus
文章平均质量分 78
trouble-i-am-in
我就是个彻头彻尾的loser,所以我除了我的命,我没什么好输的了。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
gdb代码调试
gdb代码调试 之前一篇博客 文章目录gdb代码调试基本环境搭建开始调试调试时指定传入参数查看源码打断点查看某个变量的值调试代码修改变量的值总结 B站视频 基本环境搭建 基本代码结构 main.c: #include <stdio.h> int main(int argc, char const *argv[]) { printf("输出的参数数量有:%d\n",argc); for (int i = 0; i < argc; i++) { pri原创 2021-08-22 11:42:23 · 554 阅读 · 0 评论 -
C语言静态库和动态库实操
C语言静态库和动态库 文章目录C语言静态库和动态库静态库制作与使用制作生成.o文件打包.o文件静态库使用动态库制作与使用生成.o文件打包.o文件使用动态库配置方式1:修改 /etc/ld.so.conf方式2:修改环境变量 PATH总结 之前一直在看文案的解释,没有实操过,所以一直不知道到底是啥意思,直到今天恰巧搞到了一个视频,所以这里记录一下。 静态库制作与使用 制作 代码基础结构: . ├── include │ └── calcute.h ├── lib ├── main.c原创 2021-08-19 22:27:55 · 615 阅读 · 0 评论 -
Makefile教程整理1-4
Makefile教程整理1-4 下面的教程都来自于陈皓大神的博客。 想要写Makefile,就需要gcc的相关知识。 Makefile教程1:基础介绍 Makefile教程1 基础教程,就是介绍Makefile的基本概念和使用,这里拿一个最简单的例子说明: 一个main.c #include<stdio.h> int main(int argc, char const *argv[]) { printf("hello world\n"); return 0; } 传统gcc编原创 2021-06-20 17:49:23 · 276 阅读 · 0 评论 -
C语言复习之:再论函数指针
C语言复习之:再论函数指针 函数指针查看方式 前面有介绍函数指针的基本定义,这里会更加复杂一点。 参考B站视频,其中大约在视频28分钟的地方开始讲这一块的内容。 这里先贴出来几个视频中的例子: int fpt(int); int *fpt2(int); int (*fpt3)(int); int (*fpt4[10])(int); int **ftp5[10](int); 先来看第一个例子:int fpt(int);,这个很简单,我们定义了一个函数变量。 再来看第二个:int *fpt2(int原创 2021-06-13 11:38:26 · 679 阅读 · 6 评论 -
C语言复习之:数组
C语言复习之:数组 数组与指针这部分在之前讲过一次,这次算是复习 参考B站视频 数组变量是数组第一个元素的首地址: #include <stdio.h> int main(int argc, char const *argv[]) { int a[10]; printf("%s\n",a==&a[0]?"yes":"no"); return 0; } 输出结果: yes 数组变量是一个常量: 正常版本: #include <stdio.h> int ma原创 2021-06-13 09:06:07 · 302 阅读 · 0 评论 -
C语言复习之:c文件和h文件
C语言复习之:c文件和h文件 在开始讲这个之前,先要弄懂extern这个关键字。 例子1:include 和 extern 这个是一个func.c: int a=1; 然后这是一个main.c: #include <stdio.h> #include "func.c" int main(int argc, char const *argv[]) { printf("a is %d\n",a); return 0; } 编译: gcc main.c -o main 运行: ./ma原创 2021-06-07 23:00:58 · 575 阅读 · 0 评论 -
C语言复习:32个关键字和运算符的15个优先级
C语言复习:32个关键字和运算符的15个优先级 C语言解析是从左边开始的,比如: #include <stdio.h> int main(int argc, char const *argv[]) { int b=0; int a=b++; printf("a is %d\n", a); printf("b is %d\n",b); return 0; } 输出结果: a is 0 b is 1 这里从a开始从左往右看,int a=b,是正确的式子,于是解析完成,然后是b++。原创 2021-06-07 22:32:35 · 718 阅读 · 5 评论 -
gcc 和 gdb
gcc 和 gdb 参考视频 gcc是编译器,用于编译c,c++,java等多种语言,生成最后的可执行文件。 gdb是程序调试器。 两者都是由GNU推出的。 gcc部分 gcc的特性:交叉平台编译,就是可以在当前的CPU上编译其他CPU平台上运行的软件,比如,你可以使用Unix的操作系统编译在X86 CPU上运行的代码。 编译过程以及其中的文件后缀约定为: 预处理 编译 汇编 链接 过程 文件后缀 说明 开始编译前 .c C语言源代码文件 .a 由目标文件构成的档案库文件原创 2021-05-22 15:54:27 · 1317 阅读 · 0 评论 -
Linux内核基础笔记:基础知识
以下笔记内容都来自《Linux内核设计与实现》。 Linux内核基础笔记:基础知识 内核代码下载地址: github 官网 内核代码结构: 内核代码特性 1 无libc库 或 无头文件 在源码中出现的类似:#include <linux/string.h>的代码,指的是include下的文件夹linux中的string.h,一般的头文件都在该目录下。 然后一些常用的C语言标准库中的函数,就在lib中,比如字符串的操作就在lib/string.c中。 简单来说两者的关系就是,lib提供函数,原创 2021-05-13 23:24:40 · 307 阅读 · 0 评论 -
《大话数据结构》之栈
栈 下面会出现一些我在《大话数据结构》之线性表中定义的数据种类,在全部完成之后,我会整理好发到我的github上去。 这个就是在一端进,同一端出的那种。 顺序存储实现栈 栈可以用线性表来存储。比如顺序存储来实现栈: 这里有一个存储头部元素的数组下标在哪里的值:top。 数据结构就是: typedef struct { SqlList sqlList; int top; } SqlListStack; 对应的出栈和入栈操作是: /** * 插入元素 * @param sqlListSt原创 2021-05-04 11:55:58 · 246 阅读 · 0 评论 -
C语言预处理器和C库
C语言预处理器和C库 C语言编译前工作 下面的步骤发生在程序交给预处理器前,由编译器处理。 字符映射,即将代码中出现的字符映射到源字符集。啥叫源字符集呢?就是程序理解的字符集。 搜索\以及后面有个换行符的代码,将其整合成一行,比如: printf("hello \ world\n"); 会被转换成: printf("hello world\n"); 将代码文本中的: 序列 空白序列 注视序列 替换成一个空格,简单来说就是将代码中的非代码部分去掉。 #define详细内容 首先原创 2021-04-18 23:41:04 · 519 阅读 · 10 评论 -
C语言结构体,联合,枚举类型,typedef
C语言结构体,联合,枚举类型,typedef 结构体 直接看代码: #include "stdio.h" #define MAX_TITLE 30 #define MAX_AUTHOR 30 #define MAX_BOOKS 10 struct book{ char title[MAX_TITLE]; char author[MAX_AUTHOR]; float price; }; struct volume{ // 结构体的数组 struct book boo原创 2021-04-17 16:09:47 · 270 阅读 · 0 评论 -
C语言文件基本操作
C语言文件基本操作 基本例子: #include "stdio.h" int main(){ // 获取文件地址指针,或者叫句柄 FILE *fileHandler= fopen("这里写一个文件的绝对路径","r"); int ch; // 读取内容 while ((ch= getc(fileHandler))!=EOF){ // 输出内容到标准输出 putc(ch,stdout); } // 释放句柄 fc原创 2021-04-12 22:31:25 · 261 阅读 · 0 评论 -
C语言关键字:const / volatile / restrict
C语言关键字:const / volatile / restrict const 与指针 这一块很有意思,就是不同的写法限定的内容是不一致的,首先我们知道加上const后该变量就会变成只读的,但是对于指针,是限制该指针指向新的地址,还是限定指针所指向的内容变成只读的: const float * pf; float const * pf2; 这两种写法是一样的。这种方式就是限定无法通过pf修改所指向的地址的内容: #include "stdio.h" int main(){ float cons原创 2021-04-12 16:05:15 · 263 阅读 · 0 评论 -
C语言分配内存
C语言分配内存 首先说基础: malloc:申请内存 参数:申请内存所需要的字节数 返回参数:void*类型的指针,如果申请内存失败,就会返回空指针 free:释放内存 参数:申请到的地址,即上面返回的指针 返回参数:无 calloc:作用和 malloc 类似,就是参数不同 下面就是借用这个内存分配演示一下生成动态数组: #include "stdio.h" #include "stdlib.h" int main(){ int arrayLength; if (scan原创 2021-04-12 11:35:59 · 239 阅读 · 0 评论 -
C语言存储类别、链接和内存管理:存储期和存储类别
C语言存储类别、链接和内存管理 基础概念,作用域和链接 存储期 啥叫存储期呢?简单来说就是当前变量什么时候被自动销毁,内存被回收。 比如: #include "stdio.h" void debug(void ); int main(int argc,char* argv[]) { // 调用 debug()函数,其中的变量 int data=1;被分配内存 debug(); // 调用结束,debug() 中的 int data=1; 被自动销毁 // 再次被调用,则再原创 2021-04-10 16:21:08 · 301 阅读 · 3 评论 -
C语言存储类别、链接和内存管理:基础概念,作用域和链接种类
C语言存储类别、链接和内存管理 基础概念 首先就是介绍一些基本概念,然后就是分别扩展这些概念的属性: 对象:内存中一个存储单位存储的具体的值 标识符 / 左值:就是代码中代表内存中对象的值,比如: int sign=1; 中的sign就是一个标识符,sign+1就不是一个标识符,因为它不代表内存中的任何一个值。 但是结合到指针就会再复杂一点: char address[]="hello world"; 这里*(address+1)也可以算是一个标识符,因为其也代表一个内存地址。 标识符有一个特性就是原创 2021-04-09 22:07:39 · 291 阅读 · 0 评论 -
C语言与字符串
C语言与字符串 字符串本质 C语言的字符串本质上就是字符的数组。 #include "stdio.h" int main() { // todo 这里特意加上 const 是为了说明这个值是不可修改的 // 更加通俗的理解就是开辟了一块只读的存储空间专门存储字符串:"hello world",然后将首地址赋值给 constString 这个指针 const char* constString="hello world"; // 这个值则是开辟了一块连续的地址空间,用来存储原创 2021-04-05 14:20:38 · 198 阅读 · 0 评论 -
C语言之预处理
C语言之预处理 这个本来没啥讲的,就是我发现了一个很有意思的东西: #include "stdio.h" #define PI 3 #define S PI*r*r int main() { int r=3; printf("%d\n",S); return 0; } 注意这里看到定义预处理的时候:#define S PI*r*r,有一个r的值是没有定义的,但是这样是没有问题的,真的有意思。 至于为什么可以这么写,是因为这里只是预处理,在真正编译的时候,会被替换成具体的值,即会原创 2021-04-04 21:00:20 · 211 阅读 · 0 评论 -
C语言之函数指针
C语言之函数指针 参考B站视频:小甲鱼C语言视频教程 在开始前,问一个问题,函数是否是类似int a=1;这样的变量? 答案如果是是的。那么是否可以定义一个函数类型的变量呢? 答案如果也是是的,那么怎么定义呢? int bigger(int,int); 类似这样,就定义了一个函数类型的变量,其接受两个int类型的输入作为参数。 具体看下面的例子: #include "stdio.h" int main() { int bigger(int,int); int smaller(int,in原创 2021-04-04 14:26:54 · 220 阅读 · 0 评论 -
C语言中的二维数组与指针
C语言中的二维数组与指针 这一块是很烦,但是理顺了之后就会简单很多。 数组存储本质 首先看下面一段代码: int singleArray[4]={1,2,3,4}; 其在内存中的就是这样的存储形式,其中地址1代表的就是singleArray,其本质就是一个指针值,所以你采用*singleArray就能获得1。 或者你还有可能见到这种写法*(singleArray+1),这样就能获得数组第二个的值,即2,这是因为地址2和地址3的值是连续的,两者之间的差值是1,为什么是1呢?这个需要结合数电的知识解释,这里原创 2021-04-03 16:02:03 · 589 阅读 · 0 评论 -
8 字符输入输出和输入验证
缓存区 缓冲区即输入到输出之间,输入会被暂存在这里,直到满足一定条件,输出内容才从缓冲区到输出。 具体的条件即为下面两种: #mermaid-svg-7b5ihIkyrP4xuB7K .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-7b5ihIkyrP4xuB7K .label text{fill:#333}#m原创 2021-03-23 22:55:23 · 409 阅读 · 0 评论 -
3 数据和C
3 数据和C graph LR start(数据类型) ---> intIndex(整数) & floatIndex(浮点数) & charIndex(字符型); intIndex ---> int; floatIndex ---> float & doubler; charIndex ---> char; graph LR start(修饰符) ---> short & long & l(long long) &原创 2021-03-13 21:14:12 · 214 阅读 · 0 评论