C语言进阶
勇士后卫头盔哥
这个作者很懒,什么都没留下…
展开
-
递归的思想与应用
前言递归是一种数学上分而自治的思想,将原问题分解为规模较小的问题进行处理,分解后的问题与原问题的类型完全相同,但规模较小,通过小规模问题的解,能够轻易求得原问题的解,但是问题的分解是有限的,当边界条件满足时,递归结束直接求解否则递归继续进行,在程序设计中递归函数就是递归的体现,递归模型的一般表示法如下递归思想的应用1.求解:Sum(n) = 1 + 2 + 3 +…+ n#include <stdio.h>#include <stdlib.h>unsigned int原创 2020-06-05 17:59:28 · 229 阅读 · 0 评论 -
多维指针和多维数组
多维指针指针的本质是变量,指针会占用一定的内存空间,可以定义指针的指针来保存指针变量的地址值,即二级指针,那为什么需要指向指针的指针呢?因为指针的本质也是变量,对于指针也同样存在传值调用与传址调用1.二级指针#include <stdio.h>#include <stdlib.h>int reset(char **p,int size,int newsize){ int ret = 1; int i = 0; int len = 0;原创 2020-06-05 13:47:27 · 142 阅读 · 0 评论 -
函数与指针分析
前言C语言中的函数有自己特定的类型,函数的类型由返回值,参数类型和参数个数共同决定,比如 int add(int i,int j)的类型为int(int,int),C语言中通过typedef为函数类型重命名typedef type name(parameter list)例如typedef int f(int,int);typedef void p(int);深入分析函数指针就是一个指向函数的指针,可以通过函数类型定义函数指针:FuncType pointer,也可以直接定义type (po原创 2020-06-04 22:15:03 · 185 阅读 · 0 评论 -
数组参数和指针参数
前言我们都知道C语言中的数组参数会退化为指针,那有没有想过为什么呢?由于C语言当初开发是为UNIX操作系统的,对于操作系统来说效率是非常重要的,当参数传递的时候如果拷贝整个数组执行效率将大大下降而且参数位于栈上,太大的数组拷贝将导致栈溢出,所以会将数组名看做常量指针传数组首元素地址,其实二维数组参数同样存在退化的问题,二维数组可以看做是一维数组且每个元素是一维数组,如下void f(int a[5])<->void f(int a[])<->void f(int *a)void原创 2020-06-04 18:17:30 · 142 阅读 · 0 评论 -
数组指针和指针数组
数组指针C语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定,例如int array[5]的类型就为int [5],也就是说array这个数组名所代表的数组它的元素类型为int,数组大小为5个元素,C语言中通过typedef为数组类型重命名,如下所示数组类型:typedef int(AINT5)[5];数组定义:AINT5 iArray数组指针用于指向一个数组,数组名时是数组首元素的起始地址,但不是数组的起始地址,通过将取地址符&作用于数组名可以得到数组的起始地址,可原创 2020-06-04 13:10:13 · 103 阅读 · 0 评论 -
指针和数组的分析
前言:数组是一段连续的内存空间,数组的空间大小为sizeof(array_type)array_size,数组名可看做指向数组第一个元素的常量指针* ,指针是一种特殊的变量,与整数的运算规则为p+n等价于(unsigned int)p+n*sizeof(*p),指针之间只支持减法运算,参与减法运算的指针类型必须相同,即p1-p2等于((unsigned int)p1 - (unsigned int)p2)/sizeof(type),特别注意的是只有当两个指针指向同一个数组的元素时,指针的相减才有意义,指针原创 2020-06-04 00:18:50 · 129 阅读 · 0 评论 -
使用C语言实现协程
前言协程是一个比较新的概念,它的使用场景越来越广泛,一些服务器的后台,高并发的场景,有时候就会就会用到协程,协程简单理解就是对进程,线程的一些改进和优化,其实对于线程也存在一定的开销,其包括创建,销毁,上下文切换,同步,条件变量,读写锁都涉及到用户态到内核态之间的切换,协程的改进点在于它调度开销小,不存在同步,死锁,资源竞争等问题,这是因为协程的调度是由我们用户态自定义完成的,是主动调度,而进程和线程的调度由内核完成,是被动调度,对于C语言来说有不少的协程库,比如libtask,libco,libgo,实原创 2020-05-24 14:49:22 · 2203 阅读 · 0 评论 -
初始化列表
初始化列表是C++引入的新特性,我们先来做个小测试来测试类中是否可以定义const成员,下面的例子合法吗,ci的值是什么,存储在哪里例子:#include <stdio.h>class Test{private: const int ci;public: int getCI() { return ci; }};...原创 2020-02-28 22:53:59 · 80 阅读 · 0 评论 -
函数
C语言程序主要是函数之间的相互调用组成的,面向过程是一种以过程为中心的编程思想,首先将复杂的问题分解成一个个容易解决的问题,分解后的问题可以按照步骤一步步完成,函数是面向过程在C语言中的体现,解决问题的每个步骤可以用函数来实现函数一般来说需要声明和定义,声明的意义在于告诉编译器程序单元的存在,而不知道是如何存在的,定义则明确指示程序单元是如何存在的,C语言中通过extern进行程序单元的声明,在...原创 2020-02-21 19:18:46 · 98 阅读 · 0 评论 -
字符串
字符串是有序字符的集合,C语言中没有字符串的概念,C语言中通过特殊的字符数组模拟字符串,C语言中的字符串是以‘\0’结尾的字符数组,双引号引用的单个或者多个字符是一种特殊的字面量,存储于程序的全局只读存储区,本质为字符数组,可以看成作是常量指针,也就是说这个字符数组在程序运行中是不能被改变的,编译器自动在结尾上加上‘\0’字符,要注意的是字符串字面量至少包含一个‘\0’字符,空字符并不是指什么字符...原创 2020-02-20 15:31:02 · 172 阅读 · 0 评论 -
动态内存分配
C语言的一切操作都是基于内存的,变量和数组都是内存的别名,那么的它们的内存分配在编译器编译的时候就决定了,即我们在定义数组的时候必须指点数组长度,这样编译器才知道给我们的数组分配多大的内存空间,进一步说,当我们的应用程序编译出来后一共需要多少内存空间就已经确定了,某些特定场合的需要,我们的程序的运行时需要一些额外的内存空间,动态内存的分配和释放涉及到两个函数就是malloc和free,mall...原创 2020-02-20 12:15:06 · 98 阅读 · 0 评论