<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[m0_49416708的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/m0_49416708</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_49416708]]></copyright><item><title><![CDATA[C之二级指针]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/109764782</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/109764782</guid><author>m0_49416708</author><pubDate>Wed, 18 Nov 2020 10:36:26 +0800</pubDate><description><![CDATA[1 一级指针
每8个bit，也就是1个字节，对应一个地址，也就是地址的最小单位是字节。
一级指针指向的内容一定是一个“地址”，而不是普通变量。
int a = 10;
int *p1；
p1 = &amp;a;
上面的代码，我们没有在定义*p1的时候直接初始化赋值，而是在 下一行进行赋值，这说明了一个容易忽略的细节，那就是：
一级指针本身p1本身也是一个变量，它跟 a 是 一样的，只不过指向的内容不同而已，a指向的是一个具体的值，而p1则是指向a的内存地址。
我们对p1的赋值和各种其他操作（不带*），都是伴]]></description><category></category></item><item><title><![CDATA[C之指针函数和函数指针]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/109735169</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/109735169</guid><author>m0_49416708</author><pubDate>Tue, 17 Nov 2020 09:30:46 +0800</pubDate><description><![CDATA[1 指针函数和函数指针
指针函数----它是一个“函数”，返回值是一个 指针，也可以理解成是一个 内存地址。
函数指针----它是一个“指针”，指向一个函数，这种函数指针在编程中用的比较多，因为指针是可以改变赋值指向的，相当于可以实现多映射，玩法儿就灵活了。
辨别指针函数和函数指针，最简单的方式就是看函数名前面的指针*有没有被括号（）包含，如果没有被包含，它就是一个指针函数，包含了，他就是一个函数指针。
2 指针函数
函数名前面的*没有被包含，函数返回类型是某一类型的指针，如下图所示：
int *f(x,y]]></description><category></category></item><item><title><![CDATA[C语言之volatile、static、const、extern]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/109728154</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/109728154</guid><author>m0_49416708</author><pubDate>Mon, 16 Nov 2020 21:13:46 +0800</pubDate><description><![CDATA[C语言之volatile、static、const、extern
1.volatile
1.1 volatile基本含义
volatile是一个类型修饰符（type specifier），是被设计用来修饰被不同线程访问和修改的变量；volatile的作用是作为指令关键字，确保本条指令不会因编译器的优化而省略，且要求每次直接到内存中读值。
volatile防止代码被编译器优化，例如：
a=1;
a=2;
a=3;

编译器会进行优化，优化为只有a=3（即忽略前三条语句，只产生一条机器代码）；如果键入volat]]></description><category></category></item><item><title><![CDATA[剑指Offer--链表-从尾到头打印链表C]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/109215918</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/109215918</guid><author>m0_49416708</author><pubDate>Mon, 16 Nov 2020 11:32:11 +0800</pubDate><description><![CDATA[1.链表
链表是一种动态数据结构。
常见的面试题：单向链表、从尾到头打印链表、删除链表的节点、链表中倒数第K个节点、反转链表、合并两个排序的链表、两个链表的第一个公共节点等

]]></description><category></category></item><item><title><![CDATA[剑指offer---基础知识：数组]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/108285467</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/108285467</guid><author>m0_49416708</author><pubDate>Thu, 22 Oct 2020 09:46:47 +0800</pubDate><description><![CDATA[1.sizeof关键字
1.1 定义一个空的类型，里面没有任何成员变量和成员函数，对该类型求sizeof，得到的结果是多少？
答案：1
解析：
空类型的实例中不包含任何信息，本来求sizeof应该是0，但是当我们声明该类型的实例的时候，它必须在内存中占有一定的空间，否则无法使用这些实例。至于占用多少内存，由编译器决定。Visual Studio中每个空类型的实例占用1字节的空间。
1.2 如果在该类型中添加一个构造函数和析构函数，再对该类型求sizeof得到的结果又是多少？
答案：1
解析：
调用构造函数和]]></description><category></category></item><item><title><![CDATA[va_start和va_end]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/108410307</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/108410307</guid><author>m0_49416708</author><pubDate>Fri, 04 Sep 2020 19:36:09 +0800</pubDate><description><![CDATA[1.在C中，当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表
void foo(…);
void foo(parm_list,…);
2.函数参数的传递原理
函数参数是以数据结构:栈的形式存取,从右至左入栈。
首先是参数的内存存放格式：参数存放在内存的堆栈段中，在执行函数的时候，从最后一个开始入栈。因此栈底高地址，栈顶低地址，举个例子如下：
void func(int x, float y, char z);
那么，调用函数的时候，实参 char z 先进栈，然后是 float y，最]]></description><category></category></item><item><title><![CDATA[剑指offer---面试流程]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/108277490</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/108277490</guid><author>m0_49416708</author><pubDate>Fri, 28 Aug 2020 12:51:21 +0800</pubDate><description><![CDATA[1.面试遇到难题
解决复杂问题的三种办法：
1.画图能使抽象问题形象化
2.举例使抽象问题具体化
3.分解使复杂问题简单化
在编写程序之前，要多想，优化时间效率和内存空间。

]]></description><category></category></item><item><title><![CDATA[C陷阱与缺陷---语法陷阱和ASCII]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/108116037</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/108116037</guid><author>m0_49416708</author><pubDate>Thu, 20 Aug 2020 11:31:35 +0800</pubDate><description><![CDATA[1.运算符优先级




运算符
结合性




() [] -&gt; .
自左向右


！ ~ ++ – (type) * &amp; sizeof
自右向左


* / %
自左向右


+ -
自左向右


&lt;&lt; &gt;&gt;
自左向右


&lt; &lt;= &gt; &gt;=
自左向右


== !=
自左向右


&amp;
自左向右


或
自左向右


&amp;&amp;
自左向右


或
自左向右


？：
自右向左


assignments
自右向左


，
自]]></description><category></category></item><item><title><![CDATA[C和指针---ADT:链表、堆栈、队列和树]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107971328</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107971328</guid><author>m0_49416708</author><pubDate>Mon, 17 Aug 2020 11:45:40 +0800</pubDate><description><![CDATA[1.内存分配
ADT如何获取内存来存储值？三种方案：静态数组、动态分配的数组和动态分配的链式结构。
静态数组要求结构的长度固定，而且长度必须在编译时确定，方案简单，最不容易出错
动态数组，可在运行中决定数组长度，
链式结构提供最大程度的灵活性，每个元素在需要时才单独进行分配，除了不能超过机器的可用内存之外，这种方式对元素的数量几乎没有什么限制，但链式结构的链接字段需要消耗一定的内存。
2.堆栈
堆栈（stack）最鲜明的特点是其后进先出的方式
2.1 堆栈接口
基本的堆栈操作通常被称为push和pop。pu]]></description><category></category></item><item><title><![CDATA[C和指针---标准函数库]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107949534</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107949534</guid><author>m0_49416708</author><pubDate>Thu, 13 Aug 2020 08:27:17 +0800</pubDate><description><![CDATA[1.整型函数
1.1 算术
int abs(int j);
long int labs(long int j);
long long int llabs(long long int j);
abs：获取整数（int类型）的绝值。（若参数的结果不能用一个整型表示，这个行为是未定义的）
labs：获取长整数（long类型）的绝值。
llabs：获取长长整数（long long类型）的绝值。
div_t div(int numer, int denom) 把 numer（分子）除以 denom（分母）
该函数返回]]></description><category></category></item><item><title><![CDATA[C和指针---输入/输出函数]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107949032</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107949032</guid><author>m0_49416708</author><pubDate>Wed, 12 Aug 2020 08:41:40 +0800</pubDate><description><![CDATA[1.二进制I/O
1.1 fread/fwrite
把数据写到文件效率最高的方法是用二进制形式写入。
size_t fread(voidbuffer,size_t size,size_t count,FILEstream);
头文件：#include&lt;stdio.h&gt;
功能：是用于读取二进制数据
成功：是实际读取的元素（并非字节）数目
失败：返回0
size_t fwrite(voidbuffer,size_ size,size_t count,FILEstream)
功能：是用于写入二进制数据]]></description><category></category></item><item><title><![CDATA[C和指针---预处理器]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107945475</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107945475</guid><author>m0_49416708</author><pubDate>Tue, 11 Aug 2020 22:09:49 +0800</pubDate><description><![CDATA[1.#define
1.1 宏
宏：允许把参数替换到文本中。所有对数值进行求值的宏定义都应该用这种方式加上括号的方式，避免在使用宏时，由于参数中的操作符或邻近的操作符之间不可预料的相互作用。
1.2 宏与函数
经常用到的比较大小的，可以定义为宏，不用函数来完成。
两个原因：用于调用和从函数返回的代码很可能比实际执行这个小型计算的工作代码更大；函数的参数必须声明为一个特定的类型，而宏是与类型无关的。
宏与函数的不同之处：
代码长度：宏每次使用时，宏代码都被插入到程序中，除非非常小的宏之外，程序的长度将大幅增长]]></description><category></category></item><item><title><![CDATA[C和指针---高级指针]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107897489</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107897489</guid><author>m0_49416708</author><pubDate>Tue, 11 Aug 2020 21:34:32 +0800</pubDate><description><![CDATA[1.指向指针的指针

]]></description><category></category></item><item><title><![CDATA[C和指针---使用结构和指针]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107854337</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107854337</guid><author>m0_49416708</author><pubDate>Fri, 07 Aug 2020 09:05:24 +0800</pubDate><description><![CDATA[1.链表
链表(linked list)就一些包含数据的独立数据结构（通常称为节点）的集合。链表中的每个节点通过链或指针连接在一起，程序通过指针访问链表中的节点，通常节点是动态分配的。
2.单链表
在单链表中，每个节点包含一个指向链表下一个节点的指针，链表最后一个节点的指针字段的值为NULL，提示链表后面不再有其他节点。
为了记住链表的起始位置，可以使用一个根指针（root pointer），根指针指向链表的第1个节点。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20]]></description><category></category></item><item><title><![CDATA[C和指针---动态内存分配]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107835903</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107835903</guid><author>m0_49416708</author><pubDate>Fri, 07 Aug 2020 07:56:44 +0800</pubDate><description><![CDATA[1.malloc calloc realloc
void malloc(size_t size) 分配所需的内存空间，并返回一个指向它的指针。内存块的大小，以字节为单位。
void calloc（unsigned int num，unsigned int size）；
功能：在内存的动态存储区中分配num个长度为size的连续空间，函数返回一个指向分配起始地址的指针；如果分配不成功，返回NULL。
malloc与calloc的区别：
后者在返回指向内存的指针之前把它初始化为0，calloc的参数包括所需元素]]></description><category></category></item><item><title><![CDATA[C和指针---结构和联合]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107830931</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107830931</guid><author>m0_49416708</author><pubDate>Thu, 06 Aug 2020 11:22:22 +0800</pubDate><description><![CDATA[1.结构
聚合数据类型能够同时存储超过一个的单独数据。C提供了两种类型的聚合数据类型：数组和结构
1.1 结构的自引用
typedef struct {
int a;
SELF_REF *b;
int c;
} SELF_REF;
这个声明里b是一个指针而不是结构
2.联合
联合的所有成员引用的是内存中的相同位置，当你想在不同的时刻把不同的东西存储于同一个位置，需要使用联合。union
3.结构名和数组名区别
数组名是有首个元素的地址，而定义结构体变量后，系统为其分配内存

...]]></description><category></category></item><item><title><![CDATA[C和指针---字符串、字符和字节]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107826878</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107826878</guid><author>m0_49416708</author><pubDate>Thu, 06 Aug 2020 08:49:17 +0800</pubDate><description><![CDATA[1.不受限制的字符串函数
1.1 复制字符串：
原型声明：char strcpy(char dest, const char *src);
头文件：#include &lt;string.h&gt; 和 #include &lt;stdio.h&gt;
功能：把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明：src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
1.2 连接字符串
原型声明： char strcat(char dest, c]]></description><category></category></item><item><title><![CDATA[C和指针---数组]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107780037</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107780037</guid><author>m0_49416708</author><pubDate>Wed, 05 Aug 2020 22:22:15 +0800</pubDate><description><![CDATA[1.下标引用
int array[10];
int ap = array + 2;
说明：
ap[0]：C的下标引用和间接访问表达式是一样的， 对等的表达式是(ap + (0)),即array[2]
ap+6：对等的表达式是array+8或&amp;array[8]
*(ap + 6)：= array[8] = ap[6]
ap[-1]：ap指向第3个元素，使用偏移量-1使我们得到它的前一个元素即array[1]
2.指针的效率
当根据某个固定数目的增量在一个数组中移动时，使用指针变量将比使用下标产生效率更]]></description><category></category></item><item><title><![CDATA[C和指针---指针]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107756573</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107756573</guid><author>m0_49416708</author><pubDate>Mon, 03 Aug 2020 10:12:13 +0800</pubDate><description><![CDATA[1.指针变量的内容
int a = 112；
float c = 3.14；
int *d = &amp;a；
float  *e = &amp;c；
表达式的值是：
a的值是112，c的值是3.14，d的值是a的地址，e的值是c的地址，*d=112，*e=3.14
2.指针的指针
int a = 12；
int *b = &amp;a；
int **c = &amp;b；
*操作符具有从右向左的结合性，*c相当于（*c）
表达式的值是：




表达式
相当的表达式




a
12


b
&amp;a]]></description><category></category></item><item><title><![CDATA[C和指针---操作符和表达式]]></title><link>https://blog.youkuaiyun.com/m0_49416708/article/details/107748194</link><guid>https://blog.youkuaiyun.com/m0_49416708/article/details/107748194</guid><author>m0_49416708</author><pubDate>Sun, 02 Aug 2020 18:02:35 +0800</pubDate><description><![CDATA[1.位操作符
&amp;与操作：如果两个位都是1，结果为1，否则为0；
|或操作：如果两个位都是0， 结果为0，否则为1；
∧异或：如果两个位不同，结果为1，如果两个位相同，结果为0
2.逻辑操作符
逻辑操作符&amp;&amp;和||：用于对表达式求值，测试它们的值是真还是假。
逻辑操作符具有短路性质，如果表达式的值根据左操作数便可决定，它就不再对右操作数进行求值，而位操作符两边的操作数都需要进行求值。
逻辑操作符用于测试零值和非零值，而位操作符用于比较它们的操作数中对应的位
3.条件和逗号操作符
条件操]]></description><category></category></item></channel></rss>