
【 C 】
C 语言汇总
HarkerYX
学习各类技术CSDN博客专家!
热爱日系指弹!
目前就职新能源汽车行业!
展开
-
自定义 vargs 可变参数实现
c语言的va_list可以传入多个参数, 而它的实现也是很简单, 很容易理解, 就是3个宏va_list实现typedef char * va_list;va_list是一个char *字符指针.va_start实现#define SIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))#define va_start(va, fmt) (va = (va_list)&fmt + SIZEOF转载 2022-01-24 14:00:07 · 1153 阅读 · 0 评论 -
《学生管理系统》
莫名其妙找到自己7年前写的学生管理系统项目,就当纪念吧 !!!https://pan.baidu.com/s/1JP9DiDVqS0UE3kMiDRGCUA原创 2019-08-22 17:22:02 · 212 阅读 · 0 评论 -
C语言链接装载流程全面分析
链接的主要内容是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。链接的主要过程包括:地址和空间分配(Address and Storage Allocation),符号决议(Symbol Resolution),重定位(Relocation)等。链接分为静态链接和动态链接。静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。而动态链接...转载 2018-11-11 14:08:11 · 864 阅读 · 0 评论 -
C语言编译流程全面分析
程序的编译流程大概分为 预处理器 -> 编译器 -> 汇编器 -> 链接器,4个阶段。 编译器又可以分为词法分析 -> 语法分析 -> 语义分析 -> 中间代码生成 -> 代码优化 ->生成目标代码等阶段。 阶段 功能 预处理器 处理宏定义,如#include表示引入其他源文件的代码,#de...原创 2018-11-11 13:17:10 · 1397 阅读 · 0 评论 -
C语言可变参数原理
在了解可变参数之前,我们先了解下函数调用惯例,这个对于入栈的理解非常重要。也是奠定了可变参数能够实现的基础。函数调用惯例 调用惯例 清理方 参数传递顺序 函数编译后修饰规则 cdecl 函数调用方 从右到左的顺序压栈 下划线+函...原创 2018-11-09 17:56:19 · 3600 阅读 · 1 评论 -
C语言中 sizeof 特殊用法
https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html6.23 Arithmetic on void- and Function-PointersIn GNU C, addition and subtraction operations are supported on pointers to void and on pointers...原创 2018-11-03 10:29:57 · 418 阅读 · 0 评论 -
extern声明外部结构体
在extern声明外部结构体变量时,遇到问题如下:a.c文件struct STRUCT_PLC_MDL_ProductInfo {Uint16 ManufacturerID; // 路由模块厂商代码Uint16 ModelID; // 路由模块芯片代码union {Uint8 BS[3];struct {Uint8 YY; // 年...原创 2018-10-26 17:33:31 · 18796 阅读 · 3 评论 -
C语言预处理流程全面分析
概述 在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令# include,宏定义命令# define等。在源程序中这些命令都放在函数之外, 而且一般都放在源文件的前面,它们称为预处理部分。 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程...原创 2018-10-29 14:51:10 · 2325 阅读 · 0 评论 -
算法系列之:排序算法
选择排序:// 选择排序 每次循环找到一个最大或者最小 和冒泡相似void ChoiseSort(int arr[], int n){ for(int i=0; i< n-1; i++) { for(int j=i+1; j<n; j++) { if(arr[j] < arr[i]) ...原创 2018-09-29 14:06:25 · 296 阅读 · 0 评论 -
算法系列之:递归算法排列组合
代码:#include<stdio.h> void Swap(char* a, char* b){ // 交换a和b...原创 2018-09-28 14:49:07 · 1288 阅读 · 0 评论 -
八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分...转载 2018-10-11 10:21:26 · 234 阅读 · 0 评论 -
C结构体的声明(extern)与调用的方式
要求如下,在.h文件中这样定义:typedef struct typFNT_GB16 // 汉字字模数据结构{ signed char Index[2]; // 汉字内码索引 char Msk[32]; // 点阵码数据};struct typFNT_GB16 code GB_16[] = // 数据表...原创 2018-09-25 09:52:07 · 22537 阅读 · 0 评论 -
C语言中的#号和##号的作用
一、一般用法我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.#include<iostream.h>using namespace std;#define STR(s) #s#define CONS(a,b) int(a##e##b)int main(){ printf(STR(vck));...原创 2018-05-16 16:31:26 · 1372 阅读 · 1 评论 -
C语言面试笔试题 ( 一 )
1.读取INt型变量地址四个字节1&4交换,2与3交换#include "stdafx.h"#include<stdio.h>#include<string.h>void swap(char **src,char**dst){ char *temp = NULL;temp=*src;*src=*dst;*dst=tem...原创 2018-03-28 10:42:27 · 1298 阅读 · 0 评论 -
C语言面试笔试题 ( 三 )
1.宏与内联函数的区别 内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完成的);宏同样是(但在预处理阶段)不同的是:内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能;宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的(在运行期间展开) 2.含参数的宏与函数的优缺点宏:优点:在预处理阶段完成,不占用编译时间,同时...原创 2018-04-02 17:41:38 · 1772 阅读 · 0 评论 -
C语言面试笔试题 ( 二 )
1.进程和线程的联系和区别 定义:一、进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。二、线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程;进程和线程的关系:(1)一个线程只...原创 2018-04-02 12:04:43 · 489 阅读 · 0 评论 -
C语言编译过程总结详解
C语言编译过程总结详解C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。过程图解如下: 从图上可以看到,整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起...转载 2018-04-08 16:03:18 · 525 阅读 · 0 评论