![](https://img-blog.csdnimg.cn/84d3ce754f5c4a9d83f70701a95c0076.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C语言高级
文章平均质量分 75
C语言高级,简介C高级语言编程讲义
呆萌宝儿姐
CSDN专家博主、阿里云开发者社区专家博主、51CTO社区专家博主、360书馆认证博主、知乎掘金B站等平台受邀作者。
如遇开发、程序等需求,博客首页下拉加入公众号,私信博主
展开
-
fseek, _fseeki64 函数应用
文章目录fseek, _fseeki64作用头文件函数原型参数返回值备注代码示例fseek, _fseeki64作用将文件指针移到指定位置。头文件fseek <stdio.h>_fseeki64 <stdio.h>函数原型int fseek( FILE *stream, long offset, int origin);int _fseeki64( FILE *stream, __int64 offset, int orig原创 2021-11-14 20:11:55 · 4419 阅读 · 0 评论 -
C语言 函数指针做函数参数(即回调函数)
函数指针10.1.1 函数类型通过什么来区分两个不同的函数?一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。函数三要素: 名称、参数、返回值。C语言中的函数有自己特定的类型。c语言中通过typedef为函数类型重命名:typedef int f(int, int); // f 为函数类型typedef void p(int); // p 为函数类型这一点和数组一样,因此我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。注意:通原创 2021-10-29 18:45:16 · 5604 阅读 · 0 评论 -
Windows下静态、动态库的封装和使用(图解)
动态库的封装和使用库的基本概念库是已经写好的、成熟的、可复用的代码。每个程序都需要依赖很多底层库,不可能每个人的代码从零开始编写代码,因此库的存在具有非常重要的意义。在我们的开发的应用中经常有一些公共代码是需要反复使用的,就把这些代码编译为库文件。库可以简单看成一组目标文件的集合,将这些目标文件经过压缩打包之后形成的一个文件。像在Windows这样的平台上,最常用的c语言库是由集成按开发环境所附带的运行库,这些库一般由编译厂商提供。12.2 windows下静态库创建和使用12.2.1 静态库的原创 2021-10-29 17:35:48 · 3397 阅读 · 0 评论 -
C语言 预处理详解(#include、#define、#if,特殊预定宏)
11.预处理11.1 预处理的基本概念C语言对源程序处理的四个步骤:预处理、编译、汇编、链接。预处理是在程序源代码被编译之前,由预处理器(Preprocessor)对程序源代码进行的处理。这个过程并不对程序的源代码语法进行解析,但它会把源代码分割或处理成为特定的符号为下一步的编译做准备工作。11.1 文件包含指令(#include)11.1.1 文件包含处理“文件包含处理”是指一个源文件可以将另外一个文件的全部内容包含进来。C语言提供了#include命令用来实现“文件包含”的操作。11.1.原创 2021-10-29 15:46:56 · 4200 阅读 · 1 评论 -
C语言 文件操作相关概念
文章目录文件相关概念文件的概念流的概念文本流二进制流文件的操作文件流总览各形式数据的输入/输出函数文件指针文件缓冲区文件缓冲区概念那么文件缓冲区有什么作用呢?文件操作函数文件操作综合案例文件相关概念文件的概念一个文件通常就是磁盘上一段命名的存储区。但是对于操作系统来说,文件就会更复杂一些。例如,一个大文件可以存储在一些分散的区段中,或者还会包含一些操作系统可以确定其文件类型的附加数据,但是这些是操作系统,而不是我们程序员所要关心的事情。我们应该考虑如何在C程序中处理文件。流的概念流是一个动态的概原创 2021-10-29 03:45:00 · 2387 阅读 · 0 评论 -
C语言 文件操作相关函数
文章目录头文件:stdio.h文件打开关闭函数文件打开(fopen)参数mode可选值案例文件关闭(fclose)文件读写相关函数总览字符读写函数字符读写案例行读写函数行读写案例块读写函数块读写案例格式化读写函数格式化读写案例随机读写函数随机读写案例文件操作综合案例头文件:stdio.h#include <stdio.h> 文件打开关闭函数文件打开(fopen)文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FIL原创 2021-10-29 03:30:00 · 2419 阅读 · 0 评论 -
C语言 文件读写综合案例:读取LOL信息
文章目录文件读写综合案例读写配置文件config.txt出现问题:解决中文乱码代码文件读写综合案例读写配置文件配置文件格式如下:正式的数据以‘:’冒号进行分割:冒号前为key起到索引作用冒号后为value是实值。#开头的为注释,而不是正式数据config.txt配置文件里填入英雄基本信息:#英雄的IdheroId:1#英雄的姓名heroName:德玛西亚#英雄的攻击力heroAtk:1000#英雄的防御力heroDef:500#英雄的简介heroInfo:前排原创 2021-10-29 03:15:00 · 2343 阅读 · 0 评论 -
C语言 fgets读取中文出现乱码
原因编码集不一致,cmd默认是gbk编码,而文本是utf8编码。解决将txt文本换为用ANSI编码保存,如下面步骤所示,保存之后再运行就OK了。原创 2021-10-29 03:00:00 · 5839 阅读 · 4 评论 -
结构体字节对齐问题探究
文章目录结构体字节对齐32、64位数据类型占用字节内存对齐内存对齐原因如何内存对齐对于标准数据类型,它的地址只要是它的长度的整数倍。对于非标准数据类型,比如结构体,要遵循一下对齐原则:手动设置对齐模数:案例:StudentStudent2全部测试代码结构体字节对齐在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访原创 2021-10-26 03:00:00 · 2419 阅读 · 0 评论 -
C语言 二维数组做参数的形式
文章目录二维数组的3种参数形式第一种形式:`int arr[3][3]`第二种形式:`int arr[][3]`第三种形式:`int(*arr)[3]`案例代码二维数组的3种参数形式第一种形式:int arr[3][3]void PrintArray01(int arr[3][3]){ for (int i = 0; i < 3; i++){ for (int j = 0; j < 3; j++){ printf("arr[%d][%d]:%d\n", i, j, arr[i]原创 2021-10-25 11:45:00 · 2670 阅读 · 0 评论 -
C语言 二维数组的线性存储特性
文章目录线性存储种类行优先存储列优先存储程序验证:C语言二维数组线性存储线性存储由于计算机的内存是一维的,多维数组的元素应排成线性序列后存入存储器。数组一般不做插入和删除操作,即结构中元素个数和元素间的关系不变。所以采用顺序存储方法表示数组。种类行优先存储将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。如:二维数组A[m][n]按行优先存储的线性序列为:A[0][0]、A[0][1]…A[0][n]、A[1][1]、A[1][1]…A[1][n]…A[m][n]、A[m][1]原创 2021-10-25 11:00:00 · 2693 阅读 · 0 评论 -
C语言之数组指针、指针数组
文章目录数组和指针问题导引作为函数参数的数组名数组指针:指向数组的指针指针数组:数组元素为指针栈区指针数组数组和指针问题导引指针和数组并不是相等的。为了说明这个概念,请考虑下面两个声明:int a[10];int *b;声明一个数组时,编译器根据声明所指定的元素数量为数组分配内存空间,然后再创建数组名,指向这段空间的起始位置。声明一个指针变量的时候,编译器只为指针本身分配内存空间,并不为任何整型值分配内存空间,指针并未初始化指向任何现有的内存空间。因此,表达式a是完全合法的,但是表达式b却是原创 2021-10-22 20:59:39 · 2739 阅读 · 0 评论 -
C语言 const使用详解
文章目录const前导知识定义基本用法修饰变量变量?常量?const与define的区分:代码应用const 定义变量修改const 变量值const 修饰指针const 与 struct 的爱恨情仇const前导知识定义它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量基本用法用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只原创 2021-10-18 17:23:13 · 2950 阅读 · 4 评论 -
一级指针易错点整理
易错点越界问题void test(){ char buf[3] = "abc"; printf("buf:%s\n",buf);}末尾还有\0,应该设置buf[4]指针叠加会不断改变指针指向如下面案例,每次对p++,就修改了指针的指向void test(){ char *p = (char *)malloc(50); char buf[] = "abcdef"; int n = strlen(buf); int i = 0; for (i = 0; i < n; i++原创 2021-10-18 11:35:55 · 2351 阅读 · 0 评论 -
C语言:字符串的格式化sprintf与sscanf详解
文章目录sprintfsprintf 基本知识sprintf 常见用法格式化字符串拼接字符串数字转字符串sscanfsscanf 基本知识%输入格式含义sccanf 常见用法sprintfsprintf 基本知识头文件#include <stdio.h>函数声明int sprintf(char *str, const char *format, ...);功能:根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到 出现字符串结束符 ‘原创 2021-10-18 11:12:54 · 3981 阅读 · 0 评论 -
C语言 野指针和空指针
文章目录空指针问题思考:案例探索:不允许向NULL和非法地址拷贝内存野指针什么情况下会导致野指针?指针变量未初始化指针释放后未置空指针操作超越变量作用域如何规避野指针初始化时置 NULL释放时 置 NULL空指针标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。要使一个指针为NULL,可以给它赋值一个零值。为了测试一个指针百年来那个是否为NULL,你可以将它与零值进行比较。对指针解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西,因为对一个NULL指针因引用原创 2021-09-26 14:42:49 · 3139 阅读 · 0 评论 -
栈的生长方向和内存存放方向
栈的生长方向栈的生长方向向下内存存放方向采取小端模式,内存存放方向向上图解:案例#include<stdio.h>#include<stdlib.h>//1. 栈的生长方向void test01() { int a = 10; int b = 20; int c = 30; int d = 40; printf("a = %d\n", &a); printf("b = %d\n", &b); printf("c = %d\n",原创 2021-09-22 16:08:40 · 2918 阅读 · 4 评论 -
C语言 函数调用模型
函数调用模型1. 函数调用流程函数调用流程分析函数参数调用代码分析自右向左入栈顺序的优点2. 调用惯例函数参数的传递顺序和方式栈的维护方式调用管理表3. 函数变量传递分析分析图1. 函数调用流程 栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今能见到的所有计算机的语言。在解释为什么栈如此重要之前,我们先了解一下传统的栈的定义: &n原创 2021-09-22 11:17:00 · 2963 阅读 · 0 评论 -
C语言 void数据类型
文章目录定义应用应用示例:1.void修饰函数参数和函数返回2. 不能定义void类型变量3. void* 可以指向任何类型的数据,被称为万能指针4. void* 常用于数据类型的封装定义void字面意思是”无类型”,void*无类型指针,无类型指针可以指向任何类型的数据。void定义变量是没有任何意义的,当你定义void a,编译器会报错。应用void真正用在以下两个方面:对函数返回的限定;对函数参数的限定;数据类型的封装(void 万能类型)应用示例:1.void修饰原创 2021-09-20 17:21:32 · 4539 阅读 · 0 评论 -
程序分区模型(代码实例解析)
3306分区模型栈区堆区堆分配内存API:callocrealloc示例代码:分区模型栈区由系统进行内存的管理。主要存放函数的参数以及局部变量。在函数完成执行,系统自行释放栈区内存,不需要用户管理。char* func(){ char p[] = "hello world!"; //在栈区存储 乱码 printf("%s\n", p); return p;}void test(){ char* p = NULL; p = func(); printf("%s\n",p); }原创 2021-09-21 23:45:07 · 2772 阅读 · 1 评论 -
C语言 sizeof操作符
文章目录sizeof操作符基本语法:sizeof 注意点:示例代码:1. sizeof基本用法2. sizeof 结果类型3. sizeof 碰到数组sizeof操作符sizeof是c语言中的一个操作符,类似于++、–等等。sizeof能够告诉我们编译器为某一特定数据或者某一个类型的数据在内存中分配空间时分配的大小,大小以字节为单位。基本语法:sizeof(变量);sizeof 变量;sizeof(类型);sizeof 注意点:sizeof返回的占用空间大小是为这个变量开辟的大小,而不只原创 2021-09-21 13:22:03 · 2706 阅读 · 6 评论 -
程序内存分区
文章目录内存分区程序运行之前代码区全局初始化数据区/静态数据区(data段)未初始化数据区(又叫 bss 区)问题:那为什么把程序的指令和程序数据分开呢?程序运行之后代码区(text segment)未初始化数据区(BSS)全局初始化数据区/静态数据区(data segment)栈区(stack)堆区(heap)变量类型的作用域、生命周期与存储位置内存分区程序运行之前我们要想执行我们编写的c程序,那么第一步需要对这个程序进行编译。预处理:宏定义展开、头文件展开、条件编译,这里并不会检查语法编译:原创 2021-09-21 14:34:02 · 2692 阅读 · 0 评论 -
C++全局变量与静态全局变量的异同(static与非static)
文章目录生命周期与作用域静态变量的声明——通过案例理解案例:局部声明静态变量案例:全局声明静态变量问题探讨:1. static全局变量与普通的全局变量有什么区别 ?2. static局部变量和普通局部变量有什么区别 ?3. static函数与普通函数有什么区别?首先我们要知道两个概念:生命周期与作用域。生命周期与作用域生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都原创 2021-09-21 23:44:19 · 6514 阅读 · 8 评论