朝花夕拾 · C语言 | 函数篇

MFC界面库BCGControlBar v32.0 - 对话框、仪表盘控件升级 亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFCv32.0正式发布!新版本支持Windows 11、增强功能区简化模式、改进控件外观等,以及其他新功能和改进。需要最新版的可以点击这里【BCG下载】 BCGControlBar Pro for MFC v32.0正式版下载 对话框和表单 1. 添加了一个新的全局标志globalData.m_bAutoPrepareComboListStyles:如果您希望. 阅读详情

一.字符输入输出函数

     1.  putchar

        从内存向终端输出一个字符。其一般形式为 putchar(c),c既可以是字符型变量或整型变量。

	    putchar('A');
        putchar(65);     
        输出AA

    2.  getchar

        从终端向内存输出一个字符。getchar函数没有参数,其一般形式为 getchar(),函数的值就是从输入设备得到的字符。

	int ret=getchar();    
	putchar(ret);            
	printf("%d,%c\n",ret,ret);
    
    输入    A
    输出    A65,A

        putchar与getchar可结合使用

	    putchar(getchar()-32);
        实现将终端输入的小写字母转换为大写输出

3.  printf

printf的一般形式为:printf(格式控制,输出表列),当二者数量不匹配时多余位随机输出 

整型:        

1. %u           以十进制无符号整型输出

2. %lu          以十进制无符号长整型输出

    %ld          以十进制长整型输出

    由于int与char型兼容,%c也可输出整型,如输出int时会将高位截断,保留低八位转换为对应的ASCII码值,虽结果有误,但语法正确

浮点型:    

3. %f            以float型输出,也可以输出double

     %lf            以double型输出

八进制:     

4. %o           以八进制输出

   %#o          以0xxx输出八进制

十六进制:  

5.%x             以十六进制输出

   %#x            以0x输出十六进制(小写)

   %#X           以0X输出十六进制

 科学计数法:

 6. %e         

     %E         

                         ' \" ' 输出  "

域宽输出:

 7.  %nd         以n位域宽输出,若数据大于n位则以实际位数输出,否则左侧补空

                         %-nd        以n位域宽输出左对齐

                         %0nd       以n位域宽输出并且前面补0

                         %.nf         以n位小数输出

                         %m.nf      以m位域宽,n位小数输出

                         %-0nd      报警告只会左对齐不补零

        八进制与十六进制也可指定输出域宽,如%8o表示输出八位八进制数,%8x表示输出八位十六进制数;此外,%lo与%lx则可表示以八和十六进制输出long型。

        八进制和十六进制输出无关符号

     int a = -1;
    
    printf("十进制(有符号): %d\n", a);   // 输出:-1
    printf("八进制(无符号): %o\n", a);   // 输出:37777777777(32位系统)或1777777777777777777777(64位)
    printf("十六进制(无符号): %x\n", a); // 输出:ffffffff(32位系统)或 ffffffffffffffff(64位)

        总结如下图所示

4.  scanf

        将从终端输入的值存入已开辟的内存地址中。

1.格式说明

        在输入整型时,可以使用空格,Tab与Enter隔开两数,除此之外用其他字符则会直接中断输入,舍弃后续读入的数字。

    scanf("%d %d",&m,&n);
    scanf("%d%d",&m,&n);
    这两种写法相同,同时若输入小数,则只会保存整数部分

        在%c输入字符时, 中间加空格可吸收所有空格,Tab与Enter。

	    scanf("%c %c",&a,&b);//可吸收空格,Tab与Enter
        scanf("%c%c",&a,&b);//读取空格,Tab与Enter,因为其也是字符

2.注意事项      

        此外 ,%f 不能接收double型,且双引号里写了什么,在输入时也要相同,所以除了格式控制符之外尽可能少写其他数据。以下是使用scanf时应注意的事项。

        此外,当有多次scanf输入时,在终端会连续读取

    int a;
    char ch;
    scanf("%d",&a);
    //getchar();
    scanf("%c",&ch);
    当输入一个整型之后会继续读取下一行的字符输入,可使用getchar()吸收空格等,注意getchar只能读取一个字符
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF);
    //通过循环可实现持续吸收缓存

     5.  puts/gets

     puts   将字符串从内存输出到终端,自动换行

    char str[128]={"hello,world"};
    puts(str);

     gets   将字符串从终端读到内存(字符串数组),可能造成越界访问。

        char str[128]={0};
        gets(str);

6.  strlen

strlen(str):计算字符串的长度(字符型数组中有效字符个数,不包含'\0')

其一般形式为:
strlen(字符数组)。它是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括'\0'在内)。例如:

char str[10]={"China"};

printf("%d",strlen(str));

输出结果不是10,也不是6,而是5。

 sizeof(str):求字符型数组在内存中所占的字节数(和空间开辟时大小有关)。

  	    char str1[]={"hol"};
        printf("%ld\n",strlen(str1));   //3
		printf("%ld\n",sizeof(str1));   //4
    注意,strlen只能读取以\0为结尾的字符串,若定义char str1[]={'q','t'}此类,则不会输出2,而是

会继续向t后面的内存查找,直到找到以\0为结尾的字符位置;而若定义char str1[]={'q','t','\0'}则会

输出2。

注意,strlen不能用于整型数组,且不能传二维字符型数组,只能传一维数组

    char str[2][2]={0};
    strlen(str);       //错误
    strlen(str[0]);   //正确

7.  strcpy

strcpy(str1,str2):字符串拷贝

其一般形式为:strcpy(字符数组1,字符串2)
strcpy是stringcopy(字符串复制)的简写。它是“字符串复制函数”,作用是将字符串2复制到字符数组1中去。

注意:

(1)字符数组1必须定义得足够大,以便容纳被复制的宇符串。字符数组1的长度不应小于字符串2的长度。
(2)“字符数组1”必须写成数组名形式(如strl),“字符串2”可以是字符数组名,也可以是一个字符串常量。例如:strcpy(strl,"China")。
(3)如果在复制前未对strl数组赋值,则strl各字节中的内容是无法预知的,复制时将str2中的字符串和其后的’0'一起复制到字符数组1中,取代字符数组1中的前面字符,最后几个字符并不一定是斜杠零,而是strl中原有的字节的内容。

strncpy(str1,str2,n)将str2的前n个字符复制到str1中替换,要注意替换的字符长度不应超过str1的大小。

8.  strcat

strcat(str1,str2):字符串拼接

其一般形式为:strcat(字符数组1,字符数组2)
strcat是String Catenate(字符串连接)的缩写。其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值即字符数组1的地址。

strncat(str1,str2,n)将str2的前n个字符拼接到str1末尾。

9.  strcmp

strcmp(str1,str2):字符串比较

返回int型数据,若str1>str2,返回大于0的值;若str1==str2,返回0;;若str1<str2,返回小于零的值。

同样的,strncmp(str1,str2,n)比较str1和str2前n个字符大小,返回结果同上

二.函数的定义

1.降低程序的耦合性(关联度),减少重复代码
2.让程序模块化,增强代码的复用性。

返回值 函数名(形参表)
{

        函数体;

}
返回值:类型说明符:int、char...等基本数据类型、构造数据类型、void。

            返回函数最终结果        注意,可以不接收返回值,编译器会自动丢弃

            void:空类型,当函数执行完,不需要有任何结果返回时,可以使用void类型的返回值

函数名:标识符,遵循标识符的命名规则
            见名知意
        Strcpy---》string copy
        动宾---    get_max_val();

                        print_star();
                        show_menu();

形参表:函数执行过程中需要用到的条件
                形式:
                数据类型  形参名,数据类型  形参名,数据类型  形参名

三.函数的调用与声明

函数名(实参表);

实参表:传递给函数的具体的条件值1,值2,值3,...

        1.实参的个数和形参的个数必须一致

        2.实参和形参数据类型要一致,或者要相兼容
        3.实参和形参名字可以相同,也可以不相同

        4.函数不被调用则不执行,调用几次,则执行几次

函数名(实参表);------>表达式的返回结果是函数的返回值类型

当函数的返回值有一个明确的返回类型时必须使用return返回,否则返回随机值,void可不用

函数的声明:

若被调函数在主调函数之后定义,则应在文件头部进行函数声明,如:

int add(int a,int b);    //add在main函数后面定义,则此时若在main调用add函数,
                         //则应在头部进行声明
int main()
{
    int sum=add(4,5);
}
int add(int a,int b)
{
    return a+b;
}

也可在主调函数内部进行声明,不过作用域仅限在主调函数内,编译时会报警告编译器找不到合适的原型,其他函数调用时可能报错,故不推荐此用法。由于C 编译器是从上往下顺序编译的,所以若定义在前,调用在后则无需声明,否则应进行声明。

此外,若被调函数add定义在另一个 .c 文件(比如 utils.c)中,而 test 在 main.c 中:

  • 即使 utils.c 里的 add 写在前面,main.c 编译时也看不到它。

  • 此时必须在 main.c 顶部或通过 #include "utils.h" 来声明 add,否则链接时会报“未定义引用(undefined reference)”错误。

总结一句话:只要被调函数的定义位置在调用位置之上,编译器就能直接识别,不需要任何额外声明。

四.函数的嵌套与传参

函数嵌套:

保护现场:当函数要被调用的时候,会将函数调用位置的下一条指令地址保存在栈空间;
恢复现场:当被调函数执行完时,通过出栈保护现场的地址,决定cpu继续执行的位置在函数被调用的下一条指令位置。

函数传参:

1.函数传参过程,其实是实参向形参拷贝的过程,实参有实参的空间,形参有形参的空间(值传递)。
2.值传递:在被调函数中,无法修改主调函数中的变量。
3.函数传参的顺序:自右向左

由图可知,主函数的实参与被调函数的形参是两个独立的空间。

五.函数的递归调用

在调用一个函数的过程中又直接或间接的调用该函数本身称为递归。

本质:循环方式

注意:1.递归要有递归的出口,否则会成为死循环

           2.递归系统调用比循环大(少用)

递归思想:跳出循环,抓住问题最根本,从循环结束条件开始入手。

六.函数和一维整型数组

传参方式:

定义:

返回值 函数名( int  数组名 [ ],int  len)
{        //sizeof(数组名) ---》sizeof(int*)---》8B        //  任何指针都占8B
        //外面数组怎么使用,函数内数组就怎么使用

}

调用:
函数名(数组名,数组长度);

注意:

1.数组作为函数参数传递时,形参必须要是数组类型:int a[],[]中的常量可以有,也可以省略。

2.数组作为函数参数传递时,本质传递的时数组的首元素地址,所以形参本质是一个地址是数组的
起始地址。

3.由于数组名传参本质传递的是首地址,所以必须要传递整形数组的长度。

4.数组作为函数参数传递给被调函数,函数内部的使用方法和外面使用一样,除了sizeof(数组名)

此外,在被调用函数中声明形参数组的大小是不起任何作用的,因为C语言编译对形参数组大小不做检查,只是将实参数组的首元素的地址传给形参数组。因此,形参数组名获得了实参数组的首元素的地址,前已说明,数组名代表数组的首元素的地址,因此,形参数组首元素和实参数组首元素具有同一地址,它们共占同一存储单元,故而数组元素的值也相同。

七.函数和一维字符型数组

传参:

char        数组名[100];

定义:
返回值   函数名(char  数组名[ ])
{

        函数体;

}
调用:函数名(数组名);

void print_str()
print_str(str);

注意:

1.一维字符型数组作为函数参数传递时,只需要传递数组即可,不需要传递长度,因为字符型型数组保存的字符串,未尾有'0'结束标志。
2.数组作为函数参数传递时,本质传递的是数组的首元素地址(在被调函数族:sizeof(数组名形参)-------》本质求地址在计算机内存中的大小)。

八.函数和二维整型数组

传参:

定义:

返回值  函数名 (int 数组名 [][列数],int 行数)

{

}
调用:  函数名  (数组名,行数)


int a[3][4] = {0};
void  print_2D_array (  int    a[ ][4],   int    hang)

{

}
printf_20_array( a,  sizeof(a)/sizeof(a[0]) );

注意:
1.二维整形数组传参时,形参必须说明是二维数组,行数可以省略,列数不能省略。

形参:        int a [ ][列数]

2.在自定义的函数中,行数无法计算,所以可以通过参数的方式传递
3.在自定义的函数中,列数可以计算:

sizeof(a[0])/ sizeof(a[0][0]);

九.函数和二维字符型数组

传参:

定义:

返回值    函数名 (char   数组名[ ][列数],int    行数)

{

}
调用:  函数名(数组名,行数);

char   str[3][100]  =  {0};


void print_2Dc_array(char  str[ ][100], int  hang)

{

}
print_2DC_array( str ,  3 );

十.变量的作用域与生命周期


1.标识符作用域(空间角度)

作用域:  标识符/变量可以被使用的范围
局部作用域:在{ }内部被定义的变量的作用范围

全局作用域:可使用范围在全局,0外面。比如:定义函数
局部变量:定义在局部作用域中的变量(函数内部定义的变量、函数形参)
全局变量:定义在全局作用域的变量。        //不宜过多,容易降低代码安全性
注意:
1.标识符必须先定义再使用。
2.在相同作用域中,不能定义同名标识符(变量、函数)
3.在具有包含关系的作用域中,出现了同名标识符,外层标识符在内层不可见(就近原则)

2.变量的生命周期(时间角度)

变量的生命周期:从变量的空间开辟到空间回收对应的生存期。
动态生命周期:
局部变量:在被定义的时候开辟空间,超出其作用域范围空间被回收。
静态生命周期:
全局变量:从程序运行之前空间开辟,程序运行结束空间被回收


static修饰的静态变量:

1.作用域没发生变化,局部作用域

2.生命周期由动态变为静态生命周期

总结:

局部变量:
1. 作用域在局部,超出局部作用域无法访问;
2. 动态生命周期,定义时开辟空间,超出作用范围空间被回收;
3. 局部变量保存在栈区,未被初始化为随机值。

全局变量/static静态变量:
1. 全局变量作用域在全局,static静态变量作用域在局部;
2. 静态生命周期:程序运行之前空间开辟,程序运行结束空间被回收
3. 全局变量/static静态变量保存在数据区。
4. 全局变量/static静态变量未被初始化时,默认为0。
5. 未初始化的全局变量/static静态变量存储在.bss段,.bss段系统默认清0.
6. 已初始化的全局变量/static静态变量存储在.data段。

  • 全局常量 / 静态常量(const 修饰的全局变量):存储在数据区(具体叫只读数据段 .rodata)。程序运行期间这片内存是只读的,试图修改会导致程序崩溃(Segmentation fault)。

  • 局部常量(函数内部的 const 变量):存储在栈区。它本质上和普通局部变量一样存在栈里,只是编译器帮你检查,禁止你在代码里修改它。它不特殊。

  • 字符串字面量(例如 "hello"):存储在数据区(常量区)。比如 char *p = "hello";,这个 "hello" 就放在只读数据段里。

  • 被 #define 定义的宏常量:不占用存储空间。它在预处理阶段就被替换掉了,编译成机器码时,它直接变成了一条指令里的立即数(立即数),存在代码段(Text Segment)里。

  • 代码区(.text):存放你的程序指令(CPU要读的机器码),只读。

  • 数据区(Data Segment)——:

    1. .data 段(已初始化数据区):存放已经初始化且值不为0的全局变量和静态变量。比如 int a = 10; 放在这。

    2. .bss 段(未初始化数据区):存放未初始化或初始化为0的全局变量和静态变量。比如 int b; 或 static int c=0; 放在这。注意:它不占磁盘空间,加载时才分配。

    3. .rodata 段(只读数据区):这就是你问的“字符串常量区”。比如 char *p = "hello"; 里的 "hello" 就放在这里。它也是数据区的一部分,但被标记为只读(Read-Only)。

3.变量的存储类型

int  a;

存储类型  数据类型  变量名;

auto:默认存储类型

static:静态变量

1.static修饰局部变量,静态变量,具备静态生命周期(延长局部变量的生命周期)。

2.static修饰函数,该函数只允许在当前文件内使用。

3.static修饰全局变量,该变量只允许在当前文件使用。

register:寄存器变量

register修饰变量时,表示建议编译器将变量存储到寄存器,用于频繁使用的变量,CPU访问速度更快。

    register int i=0;//register只是个建议
    int *p;
    p=&i;        //❌地址是对内存的编号,i是寄存器变量,无法取地址。

extern:修饰全局变量/函数声明

1.extern修饰全局变量,用来声明全局变量,表示允许被外部的.c文件使用。

2.extern声明函数,表示该函数允许被外部的.c文件使用。

十一.静态函数与普通函数的区别

特性静态函数(static)普通函数(默认 extern)
可见范围仅限定义它的 .c 文件整个项目(所有 .c 文件)
链接属性内部链接(Internal Linkage)外部链接(External Linkage)
命名冲突风险✅ 安全(同名也不怕)❌ 危险(同名会链接报错)
封装性✅ 强(对外隐藏实现细节)❌ 弱(暴露给全局)
是否能被 extern 引用❌ 不能(链接器找不到)✅ 能(通过头文件声明即可)
常见使用场景模块内部辅助函数、工具函数模块对外公开的 API 接口

十二.预处理命令

1.gcc编译的四个步骤

gcc main.c -> a.out
预处理:

展开和#相关的代码:展开头文件、展开宏、处理预处理命令

#include <stdio.h>
#define PI 3.1415
#if0
#endif

gcc -E main.c -o main.i

编译:

将c语言程序转换成汇编指令。
gcc -S main.i -o main.s

汇编:

将汇编指令转换成二进制可执行程序
gcc -c main.s -o main.o

链接:

负责链接系统的函数/库函数的实现(链接函数)
gcc main.o -o main

2.预处理命令

  • 宏定义
  • 不带参宏:--->符号常量

#define  标识符  值

#define  PI  3.1415

注意:

1.宏作为预处理命令,负责在预处理阶段展开,不做运算,只是代码的替换

2.宏标识符最好大写

3.宏只是代码的替换,尽量加()

4.宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换

5.#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。
6.可以用#undef 命令终止宏定义的作用域。

7.宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作
字符替换,不分配内存空间

  • 带参宏

#define  宏名(参数表)  字符串

1.对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参

2.在宏定义时,在宏名与带参数的括号之间不应加空格;否则将空格以后的字符都作为代替字符串的一部分

  • 带参宏与函数的区别:

(1)函数调用时,先求出实参表达式的值,然后代人形参。而使用带参数的宏只是进行简单的字符替换。例如上面的S(a+b),在宏展开时并不求a+b的值,而只将实参字符"a+b"代替形参r。
(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值"的概念。

(3)对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何类型的数据。

(4)调用函数只可得到一个返回值,而用宏可以设法得到几个结果。

(5)使用宏次数多时,宏展开后源程序变长,因为每展开一次都使程序增长,而函数调用不会使源程序变长。
(6)宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。一般用宏来代表简短的表达式比较合适。有些问题,用宏和函数都可以。

(7)宏是预处理阶段的代码替换,会使代码体积增大.函数是在运行时的调用,需要保护和恢复现场

  • 头文件包含
#include<stdio.h>
#include "head.h"

头文件放:
1.可以有包含的其他头文件
2.声明的数据类型
3.宏定义
4.函数和全局变量的声明

注意:
1.<>表示包含的是系统中的头文件,让编译器从系统路径下找:/usr/include
2." "表示包含的头文件是用户自己定义的头文件,让编译器从当前路径下寻找。

esc进入命令行,:+vsp竖向打开多文件;:+sp横向打开多文件

#ifndef __HEAD_H__        //防止宏定义被多次展开
#define __HEAD_H__

#include<stdio.h>

#define ADD(A,B) ((A)+(B))

#endif

    • 条件编译

    1.头文件中防止头文件重复包含

    #ifndef 宏
    #define 宏
    //头文件内容
    # endif 

    根据“宏”有没有被定义出来决定该头文件中的内容要不要加入到编译中。


    2.条件编译

    #if        逻辑结果表达式
    // 代码
    # endif 

    根据“逻辑结果表达式”的结果,决定中间的代码要不要加入到编译中


    //代码屏蔽
     

    # if 0 
    //代码
    # endif 

    3.

    #ifdef 宏
    //代码1
    # else 
    //代码2
    # endif 

    根据“宏”有没有被定义决定是否编译代码1或者代码2
     

    #ifndef 宏
    //代码1
    # else 
    //代码2
    # endif 
    AI原生应用评测:主流大语言模型性能对比 任务适配性:是否匹配应用的核心任务(如代码生成需强逻辑推理,内容创作需强创意性);上下文能力:处理长序列(如10万+字文档)的理解与生成能力;可靠性:幻觉(Hallucination)率、事实准确性、安全合规性;性价比:API调用成本、延迟、 scalability(扩展能力)。AI原生应用的核心是LLM与应用场景的深度协同。 阅读详情

    相关推荐

    Spring Boot 实现多图片上传并回显,涨姿势了~

    上传 Controller的代码非常简单,由于用了SpringMVC框架,所以直接用MultipartFile来接即可。由于是多图片上传所以用数组来接。此处应该注意参数名应该和<input>中的name值相对应: @RequestMapping("/pic") @ResponseBody publicResponseEntity<String>pic(MultipartFile[]pictures)throwsException{ ResponseEnti...

    weixin_54556126的博客 894

    朝花夕拾 · C语言 | 数组篇

    数组一般形式:类型说明符 数组名 [常量或常量表达式];类型说明符:基本数据类型、构造数据类型(不能是void类型)。说明数组中保存的数据的数据类型。数组名:遵循标识符的命名规则。常量或常量表达式:数组中可以保存的元素的个数。int a[10];sizeof (a);//40字节//32字节//20字节注意:常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的。

    Vvc_Python的博客 719

    MongoDB启动失败(service mongod start):Failed to unlink socket file /tmp/mongodb-27017.sock Unknown error

    错误日志(/var/log/mongodb/mongo.log): 2019-09-16T06:00:00.251+0000 I CONTROL [main] ***** SERVER RESTARTED ***** 2019-09-16T06:00:00.253+0000 I CONTROL [main] Automatically disabling TLS 1.0, to force-e...

    deantzzz的博客 1838

    朝花夕拾 · C语言 | 指针篇

    基类型 *变量名;基类型:该指针指向的空间存储的数据的数据类型:int、char、float 、double 、void、构造数据类型* : 类型说明符,说明后面的变量是一个指针变量名:遵循标识符的命名规则p开头指针变量中保存的地址,是该数据类型的首地址。

    Vvc_Python的博客 409

    AWR1642+DCA1000EVM 不使用mmWave Studio软件采集原始ADC数据 Timeout问题汇总

    DCA1000 EVM Timeout问题汇总

    Jesy_Hsu的博客 1476

    Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

    本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py和Pandas库,详细演示了如何高效读取HDF5格式文件、理解数据结构、提取关键特征(如传感器数据与剩余使用寿命RUL),并整合为可用于预测性维护分析的DataFrame,帮助研究者和工程师快速上手这一重要的工业时序数据集。

    weixin_29083373的博客 279

    朝花夕拾 · C语言 | 基础篇

    你是否曾与C语言初次相遇,许多概念一知半解。如今带你重走来时路,从头梳理语法、指针、内存、结构体等,陪你扫清底层盲区,为嵌入式开发筑牢根基。以此系列博客,记录复盘全过程。

    Vvc_Python的博客 390

    国密系列算法简介

    众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。其中SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。目前,这些算法已广泛应用于各个领域中,期待有一天会有采用国密算法的区块链应用出现。其中SM1、SM7算法不公开,调用该...

    HardessGod的博客 5777

    朝花夕拾 · C语言 | 结构体篇

    int num;结构体类型 变量名;int mon;int day;}mydate;

    Vvc_Python的博客 357

    参考线平滑-FemPosDeviation-SQP

    使用SQP(顺序二次规划)对离散点进行平滑

    mpt0816的博客 2439

    一文了解ECU软件刷写的2种方法:Bootloader刷写和调试器刷写

    分为刷写前、刷写中和刷写后三个阶段,如下示意:下面我们来详细了解一下Bootloader收到外部请求后开始刷写的三个阶段1)刷写前进行刷写的准备,一是确保刷写阶段总线通信的稳定性,二是避免刷写阶段出现非预期的故障,三是读取车辆数据供刷写前的一些检查等,如下所示:首先进行会话控制,通过功能寻址方式进入扩展会话模式,为后面的信息访问及其他指令做准备;然后检查刷写的前提条件,通过物理寻址方式发送历程控制请求。比如车确实处于静止状态,供电电压稳定等条件下才允许刷写;

    menghuyouyou的博客 5785

    朝花夕拾 · C语言 | 内存篇

    内存管理

    Vvc_Python的博客 466

    【深度学习|学习笔记】广义线性模型Generalized linear model(GLM)模型详解,附代码。

    【深度学习|学习笔记】广义线性模型Generalized linear model(GLM)模型详解,附代码。

    2401_89898861的博客 1875

    朝花夕拾 · C语言 | 预处理命令篇

    预处理:展开和#相关的代码:展开头文件、展开宏、处理预处理命令编译:将c语言程序转换成汇编指令。汇编:将汇编指令转换成二进制可执行程序链接:负责链接系统的函数/库函数的实现(链接函数)

    Vvc_Python的博客 386

    NTscan扫描工具

    ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

    TMS_WebGMaps_1.9.8.0_Full_Source

    TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

    [C语言朝花夕拾] C语言中的命令行输入参数判断

    在C语言中,我们的函数入口经常会有: int main(int argc, char** argv) { ... return 0; } 类似这样的传入参数,这类型的参数是为了,用户在利用命令行调用该程序的时候,能够传入适合的参数去控制程序的特定行为。例如,假如现有程序: #include <stdio.h> int main(int argc, char** argv) { printf("number of arg %d\r\n", argc); int i = 0; for

    机器学习杂货铺1号店 1879

    Devexpress16.2.6破解工具

    Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

    C语言修炼——数组与函数全析!!!

    本篇包含了几乎所有数组与函数所需掌握的基础知识,篇幅较长。初学者需要耐心观看;同时,掌握本篇知识后推荐进入本篇的专栏,阅览《C语言修炼——扫雷游戏?冲冲冲!!!》,并完成项目实操,让自己对知识的掌握更上一层楼,或借此与本篇结合反复回看,弄清不通之处。ret_type fun_name(形式参数) {ret_type是函数返回类型fun_name是函数名( )中的是形式参数{ }中的是函数体我们可以将函数想象成做菜,食材是参数,函数(子程序)的结果是菜。

    Meanlong_的博客 2288

    精雕软件(JDpaint) 5.5 绿色版

    精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

    [朝花夕拾C语言]:指针的进阶学习

    指针到底是个啥呢?在指针里面(1.数组 2.数组指针 3.指针数组 4.函数指针 5.函数指针数组) 的基本概念和应用,如何区分!

    qq_44838021的博客 223

    朝花夕拾 · C语言 | 多文件篇

    4.在对应的头文件中加extern关键字声明,头文件中全局变量只能声明不能初始化,定义应在.c文件。Makefile:管理代码工程的编译和链接,由make工具进行解释,实现一键化工程的编译和链接。依赖文件(生成目标文件所依赖的源文件):main.c sum.c sub.c ......编译规则:gcc main.c sub.c sum.c ( -o a.out)在头文件的声明里,函数默认为extern,编译器会自动加上。2.如果只是在定义该全局变量的文件中使用该全局变量,可以不声明;

    Vvc_Python的博客 394

    朝花夕拾 · C语言 | 流程控制篇

    if,switch,for,while,do while

    Vvc_Python的博客 351

    朝花夕拾C

    偶然见看到这个问题:structure alignment 这些C的问题都是相当基础而且经典的。 然而我在编译的途中,犯了个更加经典的错误,囧~决定重新拾起大一没学好的C,也好好记录下来。 直接拷贝的源代码,就加了一main函数,打印三个struct的size struct X { short s; /* 2 bytes */ /* 2 padding

    Make history... 470

    朝花夕拾 · C语言 | 位运算篇

    <按位左移 按位左移,低位补0 num << n <===> num *2^n。>>按位右移 按位右移动,有符号数高位补符号位:无符号数高位补0。| 按位或 有1则1,全0为0。~按位取反 1取反为0,0取反为1。1010 0010 //低四位置0。& 按位与 全1为1,有0则0。^ 按位异或 相同为0,相异为1。3.两数交换(不使用中间变量)

    Vvc_Python的博客 299

    【朝花夕拾C语言】:字符转换函数

    学习了字符转换函数(isupper、islower 、toupper和tolower等),来和大家分享一下!

    qq_44838021的博客 375

    朝花夕拾 · C语言 | 调试篇

    l 列出原代码。q 退出gdb。r 运行程序。S 跟进函数。1.编译程序:-g选项:允许使用gdb进行调试。gnu提供的Linux下的代码调试工具。b+行号 在指定行打断点。p+变量名 查看变量值。where 定位段错误的位置。1.使用gdb调试逻辑错误;2.使用gdb调试段错误。gdb./可执行程序。

    Vvc_Python的博客 164

    【朝花夕拾C语言】:memmove函数和my_memmove

    本文仔细介绍一下,最近学习的内存函数memmove函数的实现过程和实际my_memmove的具体实现代码,学了些知识点,还是想记录一下并和大家分享!

    qq_44838021的博客 690

    [朝花夕拾C语言]:排序函数qsort详细讲解

    通过对: 1.整型冒泡排序; 2.qsort函数对于排序捷运用,其中通过建立结构体指针,对相同的项进行比较; 3.对sizeof()和stelrn()的基本概念和基本运用的分析。 加深理解!

    qq_44838021的博客 570

    朝花夕拾C语言:输出字母对应的金字塔

    输出字母对应的金字塔

    qq_44838021的博客 479
    上一篇: 朝花夕拾 · C语言 | 基础篇
    下一篇: 朝花夕拾 · C语言 | 流程控制篇
    剑指offer.
    博客等级 码龄3年 15粉丝 38原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值