自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 C语言函数的深入解析与实践

在C语言中,函数是程序的基本构成单元,它将一组相关的代码封装起来,用于实现特定的功能。本文将从函数的基本概念、定义、调用,到数组作为函数参数的用法,再到递归的实现,进行详细的讲解和实践。函数是C语言中非常重要的概念,通过函数可以实现代码的模块化和复用。函数可以理解为一个“黑盒子”,它接收输入数据(参数),经过内部的处理逻辑,输出结果。1. 形参写法:形参可以写为`int a[]`或`int *a`,两者等价。2. 地址传递:数组作为参数时,传递的是数组的首地址,而非整个数组。// 输出逆序后的数组。

2025-02-13 01:52:45 428

原创 深入解析指针:从基础到高级应用

指针是C语言中非常强大的工具,通过指针可以实现高效的内存操作、函数回调、动态数据结构等。命令行参数通过`main`函数的参数`argc`和`argv`传递。`argc`表示参数个数,`argv`是一个字符串数组,存储了传递给程序的参数。二级指针是指针的指针,即它指向的地址中存储的是另一个指针的地址。`a`的内存单元编号(地址)可以通过`&a`获取,而指针就是用来存储这种地址的。`p`指向字符串常量,不能通过`*p`修改字符串内容。

2025-02-11 20:55:41 1022

原创 accept

accept函数用于从监听队列中取出一个已完成的连接请求,并创建一个新的套接字来处理这个连接。这是服务器端网络编程中的一个关键步骤。

2025-03-13 16:32:36 299

原创 listen

listen函数用于将一个套接字标记为被动套接字,以便接受传入的连接请求。这是服务器端网络编程中的一个关键步骤。

2025-03-13 16:28:20 185

原创 bind函数

服务器端:必须调用bind函数来绑定到特定的端口,以便客户端可以连接。客户端:通常不需要显式调用bind函数,系统会自动分配一个临时端口。如果需要绑定到特定的本地地址或端口,可以调用bind函数。

2025-03-13 16:25:15 133

原创 connect 函数

功能客户端使用该函数向目标主机发起连接请求,建立网络通信链接。sockfd:本地已创建的套接字描述符(通过 函数创建)。addr:指向目标主机地址信息的指针。通常是一个 或 类型的指针。addrlen: 参数所指向结构体的长度(以字节为单位)。成功时返回 0。失败时返回 -1,并设置 错误码。字段说明 sin_family:地址族,通常设置为 (IPv4)。sin_port:端口号,以网络字节序(大端)存储。使用 函数将主机字节序转换为网络字节序。sin_addr:IP 地址,

2025-03-13 15:29:08 370

原创 socket套接字

如果需要指定特定协议(如 IPPROTO_TCP、IPPROTO_UDP),可以显式设置。在多线程或并发环境中,套接字描述符需要正确管理,避免资源泄漏或竞争条件。创建套接字后,需要根据通信类型(服务器或客户端)调用相应的函数(如。程序向内核提出创建一个基于内存的套接字描述符,用于网络通信。成功时返回一个非负整数,表示新创建的套接字描述符。:原始套接字(用于自定义协议,如 IP)。:面向连接的字节流套接字(如 TCP)。:无连接的数据报套接字(如 UDP)。:本地通信(文件系统套接字)。

2025-03-13 15:19:52 280

原创 fwrite

是一个非常有用的函数,用于向文件流中写入数据块。通过指定每个元素的大小和元素数量,可以灵活地写入各种类型的数据,包括整数、字符和结构体等。以下是一个完整的示例,展示如何将数据写入文件并读取回来。是 C 语言标准库函数之一,用于向文件流中写入数据块。确保文件是以正确的模式打开的。返回的值小于预期,可能是由于磁盘空间不足或其他错误。如果缓冲区中的数据不足,可能会导致未定义行为。和其他文件操作函数,可以实现对文件的高效写入和管理。指向文件流的指针,该流必须是以写入模式打开的(如。指向要写入数据的缓冲区的指针。

2025-03-07 21:04:22 186

原创 fread

是一个非常有用的函数,用于从文件流中读取数据块。通过指定每个元素的大小和元素数量,可以灵活地读取各种类型的数据,包括整数、字符和结构体等。,其中包含一组学生信息,每个学生信息用一个结构体表示。,其中包含一组整数,每个整数占 4 个字节。确保缓冲区足够大,以容纳读取的数据。确保文件是以正确的模式打开的。例如,如果要读取文件,文件必须是以。返回的值小于预期,可能是由于文件末尾或发生错误。和其他文件操作函数,可以实现对文件的高效读取和管理。指向文件流的指针,该流必须是以读取模式打开的(如。关闭文件,释放资源。

2025-03-07 20:59:20 328

原创 fopen

是一个非常常用的函数,用于打开或创建文件。: 以追加模式打开文件。如果文件不存在,创建新文件。: 以追加模式打开文件。如果文件不存在,创建新文件。: 以写入模式打开文件。如果文件不存在,创建新文件。: 以读写模式打开文件。如果文件不存在,创建新文件。是 C 语言标准库函数之一,用于打开或创建文件。和其他文件操作函数,可以实现对文件的高效读写和管理。: 以只读模式打开文件。: 以读写模式打开文件。确保文件路径正确,并且程序有权限访问文件。指定文件的打开模式。如果文件路径不存在或权限不足,关闭文件,释放资源。

2025-03-07 20:52:03 361

原创 线程与进程的深入解析及 Linux 线程编程

进程是程序的执行实例,是操作系统进行资源分配和调度的基本单位。每个进程都具有自己的独立内存空间、程序计数器、堆栈等资源。进程的创建过程是通过复制当前进程的数据来完成的,常见的系统调用有fork()和vfork()fork()vfork()exec()_exit()然而,进程的创建通常涉及大量的数据复制,影响系统的效率。这是因为每个进程都需要有独立的资源,造成一定的开销。

2025-02-21 21:45:50 1135

原创 linux进程

通过本文的学习,我们深入了解了C语言中的进程管理,包括fork()execvp()wait()等函数的使用。通过这些机制,我们可以实现父子进程的创建、程序的执行以及资源的回收。在实际编程中,fork()和exec()是两个非常常用的系统调用,父进程通过fork()创建子进程,而子进程通过exec()执行新的程序。在多进程环境下,我们还必须关注僵尸进程的管理,确保父进程使用wait()正确地回收子进程资源。文件操作中的同步也是一个重要课题,当多个进程访问同一文件时,我们必须小心同步问题,避免数据竞争。

2025-02-20 21:12:10 467

原创 exec()函数

exec()系列函数是非常强大且常用的系统调用,它们允许一个进程用新的程序替换自己,从而执行不同的任务。常见的使用场景包括执行命令、创建新的进程来执行任务等。通过合理的使用exec(),可以有效地实现多任务处理,尤其是在 shell 和进程管理中。

2025-02-20 21:08:05 658

原创 文件编程中的进程与多任务处理

即使运行的是同一个程序,每次创建的进程都是独立的。例如,`main.c`是程序的源代码文件,而`a.out`是编译后的可执行程序。运行`a.out`的命令(如`./a.out`)会将程序加载到内存中,形成一个进程。• 孤儿进程:父进程退出后,子进程仍然存在,由`init`进程(PID 为 1)收养。• 僵尸进程:子进程退出后,父进程未回收子进程的资源,子进程进入僵尸态。`fork()`是创建进程的核心函数,用于从当前进程中克隆一个子进程。• `ps -aux`:查看系统中所有进程的详细信息。

2025-02-20 02:51:15 887

原创 文件与目录操作函数详解

在编程中,文件和目录操作是常见的任务。本文将详细讲解常用的文件操作函数和目录操作函数,包括其功能、参数、使用方法,并通过示例代码展示如何用这些函数实现常见的操作。

2025-02-17 13:17:15 1108

原创 Linux 文件操作与标准 I/O 库:深入解析与实践

Linux 文件操作的核心思想是“一切皆文件”,通过标准 I/O 库,开发者可以方便地进行文件的读写操作。标准 I/O 库封装了底层的系统调用,提供了高效的缓冲区管理和优化的读写机制,使得文件操作变得简单而高效。通过本文的介绍和实践案例,读者可以更好地理解和应用 Linux 文件操作的知识,提升编程能力。在 Linux 中,文件名是用于标识文件的字符串,例如`01.sh`。标准 I/O 库是 C 语言中用于文件操作的库,广泛应用于各种操作系统,包括 Linux、Windows 和 macOS。

2025-02-13 21:17:41 338

原创 Linux Shell 编程:从基础到实战

例如,当我们输入`ls`命令时,Shell 会将该命令传递给内核,内核执行后将目录内容返回给 Shell,Shell 再将结果显示在屏幕上。在 Shell 中,引号有三种类型,分别是双引号(`"`)、单引号(`'`)和反引号(`` ` ``)。我们可以通过`env`命令查看所有环境变量,也可以通过`$`符号引用环境变量的值,例如`$PATH`。• `$1`、`$2`、`$3`……需要注意的是,脚本文件的第一行`#`printf`命令则提供了更复杂的格式化输出功能,类似于 C 语言中的`printf`函数。

2025-02-13 01:36:13 642

原创 C语言进阶:共用体、枚举、typedef与位运算详解

枚举用于定义一组命名的整数常量,提高代码可读性。默认从0开始递增,可手动赋值本质是整型,但提供语义化命名共用体:内存共享,适合数据转换和节省空间枚举:增强可读性,管理离散状态typedef:简化复杂类型声明位运算:底层硬件操作的核心技术掌握这些特性将显著提升C语言开发能力,尤其在嵌入式系统和性能敏感场景中表现突出。建议通过实际项目练习巩固这些概念。

2025-02-11 17:45:41 1132

原创 c语言:结构体

例如,`char`类型按1字节对齐,`short`类型按2字节对齐,`int`类型按4字节对齐。今天,我们重点来探讨一下结构体,它是一种用户自定义的数据类型,能够帮助我们更好地处理现实生活中更复杂的数据描述。结构体的定义方式比较灵活,可以在全局定义,也可以在局部定义。同时,我们还可以思考一些问题,比如什么是内存对齐,为什么需要内存对齐等,这些问题有助于我们深入理解结构体的内存布局和性能优化。需要注意的是,同一类型的结构体变量之间可以相互赋值,赋值时是将结构体成员的值一一对应地赋给另一个结构体变量的成员。

2025-02-09 20:18:20 618

原创 c语言预处理

预处理器会读取源代码文件,根据预处理指令进行处理,生成一个新的文件,然后将这个文件传递给编译器进行后续的编译工作。在预处理阶段,所有出现的`PI`都会被替换为`3.1415926`。在C语言的开发过程中,编译是一个至关重要的环节,而预处理则是编译过程中的第一步。预处理是C语言编译过程中的第一步,它通过宏定义、文件包含和条件编译等功能,为代码的开发提供了极大的便利。它通过`#ifdef`、`#ifndef`和`#if`等指令实现。• `add.c`和`add.h`:实现加法功能的源文件和头文件。

2025-02-07 20:56:55 219

原创 day7 二维数组 字符型一维数组

实际上,C语言中并不存在真正的二维数组,二维数组本质上是一维数组的一维数组。可以看到,charch[]={'h','e','l','l','o'};这两种方式都可以定义字符数组,但后者会自动在末尾添加结束标志\0,即'h','e','l','l','o',0,0,0,0,0。例如,charch[10]={'h','e','l','l','o'};需要注意的是,在初始化时,二维数组的行数可以省略,但列数不能省略,例如inta[][4]={1,2,3,4};

2025-01-19 22:36:39 378

原创 嵌入式学习day6 数组 排序

在识别数据类型时,以 int score[30] 为例,去掉 score 后, int[30] 就是该数组的数据类型,它表示能存放30个 int 型变量的一类数据。, a 代表的数组类型是 int[10] ,其值为数组首元素的地址,即 &a[0]。具体来说,在每一轮排序中,从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。1. 思想:冒泡排序的思路是让相邻的两个元素两两比较,根据比较结果将小的元素放在前面,大的元素放在后面。

2025-01-17 22:16:01 278

原创 嵌入式学习Day5--流程控制

• 在每次循环体执行完毕后,都会计算该条件表达式的值。用表达式的结果 匹配 case 后面的 常量表达式的值 , 如果 匹配成功(值是一样的) 则执行 case 下面的 语句 直到 遇到 break 或者 switch 语句的 } (右) 则执行结束。• 然后检查条件表达式,如果条件为真(非0),则执行循环体。• 重复检查条件表达式,直到条件为假(0)时结束循环。2. while循环:• 先检查条件表达式,如果条件为真(非0),则执行循环体。• 然后检查条件表达式,如果条件为真(非0),则重复执行循环体。

2025-01-16 22:03:31 869

原创 嵌入式学习Day4

lf //表示 给doule类型变量中输入数据 %f //float类型的变量中输入数据 %Lf //匹配 long double 类型变量。%d //默认是匹配 int类型变量 %ld //long int 类型 %lld //long long int 类型。m //指定输入宽度 //浮点数中 小数点 也算一列宽度 .n //输入时,不能指定 精度。%.nf 表示保留n位小数 %.ng 表示保留结果中的n位数字 %.ns保留前n个字符。运算结果表示--1表示真 0表示假 例:1>2结果为0。

2025-01-15 22:59:37 512

原创 嵌入式学习day3

隐式类型转化 char short float参与类型不同的混合运算中,char short 会转化为int float会转化为double,int转为unsigned转为long转为double。%d--转化为有符号十进制形式输出 %u--转化为无符号十进制形式输出 %x--转化为十六进制形式输出 %o--转化为八进制形式输出 %#x将十六进制的前缀0x输出 %#o将八进制的前缀0输出。\t:跳到下一个tab位置 一个tab占八个字符位置 如果上一个tab位置占满则\t会占下个tab位置会再空8个字符。

2025-01-14 23:32:11 363

原创 linux基础

1 000 0000 0000 0000 0000 0000 0111 1011 //负的123 --原码 1 111 1111 1111 1111 1111 1111 1000 0100 //负的123 --反码符号位不变其余位按位取反。整型常量 123//十进制的常量形式 0123//八进制的常量形式 0x123//十六进制的常量形式。0000 0000 0000 0000 0000 0000 0111 1011 //123 --反码。小端(高高低低):高位数据存储在高位地址 低位数据存储在低位地址。

2025-01-13 23:35:41 82

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除