C语言
文章平均质量分 61
不停歇向前^-^蜗牛
初来乍道,请多多指教
展开
-
结构体对(对齐)计算
我们实际生活中,保存的数据一般不会是同一种类型,所以引入了结构体。而结构体的大小也不是成员类型大小的简单相加。需要考虑到系统在存储结构体变量时的地址对齐问题。由于存储变量地址对齐的问题,结构体大小计算必须满足两条原则:一、结构体成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)二、结构体大小必须是所有成员大小的整数倍下面来具体分析1、简单结构体struct s1{char ch1;char ch2;int i;};这个结构体的大小容易计算,满足两个原则即可,为8,那么下面原创 2022-05-12 16:21:05 · 117 阅读 · 0 评论 -
C语言关于内存理解
1 程序运行为什么需要内存1.1 计算机程序运行的目的计算机为什么需要编程?编程已经编了很多年,已经写了很多程序,为什么还需要另外写程序?计算机有这个新的程序到底为了什么?程序的目的是为了去运行,程序运行是为了得到一定的结果。计算机就是用来计算的,所有的计算机程序其实都是在做计算。计算就是在计算数据。所以计算机程序中很重要的部分就是数据。计算机程序 = 代码 + 数据。计算机程序运行完得到一个结果,就是说代码 + 数据 (经过运行后) = 结果。从宏观上来理解,代码就是动作,就是加工数据的动作;数原创 2022-05-06 15:23:45 · 903 阅读 · 2 评论 -
sscanf函数使用详解
描述sscanf通常被用来解析并转换字符串,其格式定义灵活多变,可以实现很强大的字符串解析功能。sscanf的原型编写小练习#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>// 字符串拆分 sscanfvoid func01(){ char msg[1024] = "phone:1234567;2024/5/20;原创 2022-05-06 14:46:12 · 8992 阅读 · 0 评论 -
sprintf 函数详解
printf函数大家都熟悉,但是printf一般打印到标准输出,在需要整理、格式化字符串时,sprintf就大显身手了。例如,在处理传感器数据时,为了将得到的数据整合成特定的格式通过网络发送出去,char buffer[100] = { 0 };sprintf(buffer, "temperature: %f; humidity:%f\r\n", tempData, humiData);send(clientSocket, buffer, strlen(buffer));又例如,在进行HTTP协原创 2022-05-05 21:51:44 · 6465 阅读 · 0 评论 -
strtok介绍及用法
函数原型用法:#include <string.h> 功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。 说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。 strtok在s中查找包含在delim中的字符并用NULL(‘\0’)来替换,直到找遍整个字符串。 返回指向下一个标记串。当没有标记串时则返回空字符NULL。写法一void func01(){ char buf[1024] = "刘备:关羽:张飞:赵云:吕布:诸葛亮"; cha原创 2022-05-05 17:07:12 · 1449 阅读 · 0 评论 -
栈、堆、静态存储区和程序的内存布局
1 栈1.1 程序中的栈栈是现代计算机程序里最重要的概念之一。栈在程序中用于维护函数调用上下文。函数中的参数和局部变量存储在栈上。栈是一种后进先出的行为。1.2 函数调用过程栈保存了一个函数调用所需的维护信息:参数、返回地址、局部变量、调用上下文、……每次函数调用都对应着一个栈上的活动记录。调用函数的活动记录位于栈的中部。被调函数的活动记录位于栈的顶部。函数调用栈变化这里返回地址描述应该是有问题,返回地址是指函数调用处后一句代码的地址。1.3 函数调用栈上的数据函数调原创 2022-04-28 10:56:10 · 1158 阅读 · 0 评论 -
数据类型和进制转换【练习】
流程图一、数据类型的定义(1)、数据类型的定义变量的定义:数据类型 变量名【标识符】变量的赋值:变量名 = 值;数据类型 变量名【标识符】 = 值标示符的命名规则:1、字母、数字、下划线2、不能以数字开头3、见名知义4、不能和同一函数内的其他标示符重复5、不能使用C语言关键字6、区分大小写标示符:ABCabc—abc_abc.123_baca_b_123常量的定义:1、const 数据类型 常量名2、【宏定义】#deifne 常量名 值注意:1、通过#d原创 2022-04-27 17:42:24 · 361 阅读 · 0 评论 -
宏定义介绍及使用
1 C语言中的宏定义#define是预处理处理的单元实体之一。#define定义的宏可以出现在程序的任意位置。#define定义之后的代码都可以使用这个宏。2 定义宏常量#define定义的宏常量可以直接使用。#define定义的宏常量本质为字面量。实例分析:宏定义分析#define ERROR -1#define PATH1 "D:\test\test.c"#define PATH2 D:\test\test.c#define PATH3 D:\test\test.cint m原创 2022-04-27 09:46:36 · 2646 阅读 · 0 评论 -
编写strcmp 和strncmp
函数原型及介绍若str1==str2,则返回零;若str1 > str2,则返回正数;若str1< str2,则返回负数。即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。如下几种情况:strcmp(“abcd”,”abcd”)的返回值是 0;strcmp(“abcd”,”dcba”)的返回值是 -1;strcmp(“dcba”,”abcd”)的返回值是 1;其它:strcmp(“A”,”C”)的返回值是 -2;strc原创 2022-04-25 18:13:25 · 280 阅读 · 0 评论 -
编写strcat和strncat
函数原型1.strcat()strcat把src所指向的字符添加到dest结尾处(覆盖原dest结尾处的’\0’),并添加新的’\0’。说明:src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串,返回指向dest的指针。strncat()strncat():strncat(dest,src,n); strncat把速溶茶所指向的字符的前n个字符添加到dest结尾处(覆盖原dest结尾处的’\0’),并添加新的’\0’。说明:src和dest所指内存原创 2022-04-25 17:20:40 · 252 阅读 · 0 评论 -
编写strcpy 和 strncpy
函数原型我们先看函数传递的参数,是两个指针,一个是strSource(字符串的源头),另一个是strDestination(字符串的目的地),因此,我们也需要传递两个指向字符串地址的指针。而我们知道库里的strcpy函数会传递源头字符串末尾的’\0’,因此我么可以这样来写代码。编程小练习1.strcpyvoid func1(){ char buf[64] = { 0 }; //buf = "hello world"; 报错,此是buf是常量 strcpy(buf, "hello w原创 2022-04-25 15:01:37 · 310 阅读 · 0 评论 -
条件编译分析及使用
1 基本概念条件编译的行为类似于C语言中的if…else…条件编译是预编译指示命令,用于控制是否编译某段代码。代码分析// #include <stdio.h>#define C 1int main(){ const char* s; #if( C == 1 ) s = "This is first printf...\n"; #else s = "This is second printf...\n"; #e原创 2022-04-22 18:19:37 · 540 阅读 · 0 评论 -
接续符介绍及用法和++和--操作符分析介绍及用法
1 接续符的意义C语言中的接续符()是指示编译器行为的利器。如下的代码是合法的么?#in\clud\e <st\dio.h>in\t m\ain(\){pri\ntf\ (\ "Hello D.T.\n" )\ ;ret\urn 0;}预处理之后的结果如下:int main(){printf ( "Hello D.T.\n" ) ;return 0;}2原创 2022-04-21 15:51:02 · 233 阅读 · 0 评论 -
#erro和#warning使用分析
1 #error的用法error用于生成一个编译错误消息。用法:#error message(message不需要用双引号包围)。#error编译指示字用于自定义程序员特有的编译错误消息,类似的#warning用于生成编译警告。#error是一种预编译器指示字。#error可用于提示编译条件是否满足。代码:#ifnedf __cplusplus #error This file should be processed with C++ compiler.#endif编译过程中的任原创 2022-04-20 20:46:48 · 628 阅读 · 0 评论 -
volatile介绍及用法和const介绍及用法
1 深藏不露的volatilevolatile可理解为“编译器警告指示字”。volatile告诉编译器必须每次去内存中取变量值。volatile主要修饰可能被多个线程访问的变量。volatile也可以修饰可能被未知因素更改的量。volatile强制编译器减少优化,必须每次从内存中取值。1 const只读变量const修饰的变量是只读的,本质还是变量。const修饰的局部变量在栈上分配空间。const修饰的全局变量在全局数据区分配空间。const只在编译期有用,在运行期无用。注意:co原创 2022-04-20 16:22:35 · 533 阅读 · 0 评论 -
void 介绍及用法 和typedef介绍及用法
1 void 修饰函数返回值和参数 如果函数没有返回值,那么应该将其声明为void; 如果函数没有参数,应该声明其参数为void; void修饰函数返回值和参数是为了表示无。注意:形参为void时代表不接受任何参数,没有写参数意味着可以接受任意多的参数 ,没有写返回值默认返回值为int类型并且值为1。2 不存在void变量C语言没有定义void究竟是多大内存的别名,没有void的标尺,无法在内存中裁剪出void对应的变量。小贴士: ANSI C:标准C语言的规范原创 2022-04-20 15:57:59 · 2302 阅读 · 0 评论 -
union用法和enum用法
1 union用法C语言中的union在语法上与struct相似。union只分配最大成员的空间,所有成员共享这个空间2 union的注意事项union的使用受系统大小端的影响编程:判断系统的大小端#include <stdio.h>// 1:小端,0:大端int system_mode(){ union SM { int i; char c; }; union SM sm; sm.i = 1;原创 2022-04-19 20:50:51 · 419 阅读 · 0 评论 -
sizeof用法和strlen函数的实现方式
1 sizeof关键字的用法sizeof是编译器的内置指示符。sizeof用于计算类型或变量所占内存大小。sizeof的值在编译期就已经确定。sizeof用于类型:sizeof(type)sizeof用于变量sizeof(var)或sizeof var2 为sizeof关键字正名sizeof是C语言的内置关键字而不是函数: 在编译过程中所有的sizeof将被具体的数值所替换; 程序的执行过程与sizeof没有任何关系。实例:sizeof的用途#include <stdi原创 2022-04-19 20:12:46 · 329 阅读 · 0 评论 -
循环语句(for,while,do...while)
1 循环语句分析循环语句的基本工作方式:通过条件表达式判定是否执行循环体;条件表达式遵循if语句表达式的原则。do、while、for的区别do语句先执行后判断,循环体至少执行一次;while语句先判断后执行,循环体可能不执行;for语句先判断后执行,相比while更简洁。2 do…while语句的循环方式3 while语句的循环方式4 for语句的循环方式编程实验:三种循环语句使用对比#include <stdio.h>int func1(int n){原创 2022-04-19 17:43:45 · 147 阅读 · 0 评论 -
指针是什么
初步了解善于利用指针指针是C语言中的一个重要概念,也是C语言的一个重要特色。正解而灵活地运用它,可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人,都应当深入地学习和掌握指针。可以说,不掌握指针就是没有掌握C的精华。指针是什么如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。比如:内存区的每一个字节有一个编号,这就是地址,它相当于旅馆中的房间号,在地址所标志的内存单元中存放的数据则相当于旅馆房间中居住的旅客。由于原创 2022-04-16 15:01:59 · 672 阅读 · 0 评论 -
C语言结构体(struct)的几种定义方式
1.struct结构体名{//成员表列};2.struct{//成员表列}变量名;结构体变量要和结构体同时定义。3.struct结构体名{//成员表列}变量名;结构体变量与结构体同时定义。4.typedef struct 结构体名{undefined//成员表列};此时结构体没有别名,定义变量形式为 struct 结构体名 变量名。5.typedef struct 结构体名{undefined//成员表列}别名;定义结构体变量可以用别名直接定义,也可以按照方式4原创 2022-04-14 20:37:31 · 3972 阅读 · 0 评论 -
函数的参数(形参与实参)—理解
函数的参数实际参数(实参)实参可以是常量、变量或表达式;真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们必须有确定的值,以便把这些值传送给形参。扩展常识:数组元素可以用作函数实参,不能用作形参。因为形参是在函数被调用时临时分配存储单元的,不可能为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)。在用数组元素作函数实参时,把实参的值传给形参,是值传递方式。数据传递的方向是从实参传到形参,单向传递。形式参数(原创 2022-04-14 17:54:37 · 4878 阅读 · 0 评论 -
数组定义及注意事项
怎样定义和引用一维数组一、一维数组是数组中最简单的,它的元素只需要用数组名加一个下标,就能唯一地确定。怎样定义一维数组//定义数组int array[100]; //表示着没有初始化的数组,仅仅请了100个整形数的内存空间 最好要初始化: int array[100]={0};int array[3] = { 1,2,3 }; //有初始化的数组,完整初始化,该数组申请了三个整形数内存空间,并赋值三个数1,2,3int array[100] = { 1,2,3 }; // 有初始化的数组,不完整原创 2022-04-13 21:44:16 · 3981 阅读 · 0 评论 -
关于Visual Studio 2022安装【超详细】
官网地址:https://visualstudio.microsoft.com/zh-hans/vs/找到刚刚下载的后缀以.exe文件点击Cancel点击继续下载插件库及路径选择安装完成后选择重启一下电脑可以选择登录(需要注册一下)或以后再说开发设置选择Visual C++ 颜色主题随意,选择完成后点击启动,启动需要等待启动完成后会自动打开,点击创建新项目再点击空项目,然后下一步项目名称随便取个,点击创建头文件 -> 右键添加 ->新建项原创 2022-04-10 17:51:58 · 4868 阅读 · 5 评论