<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[aLLLiyyy的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/aLLLiyyy</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; aLLLiyyy]]></copyright><item><title><![CDATA[C语言中的结构体可以声名函数么？]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/124552386</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/124552386</guid><author>aLLLiyyy</author><pubDate>Tue, 03 May 2022 11:44:05 +0800</pubDate><description><![CDATA[首先应该明确是在C语言里面，而不是在C++里面。
然后依次回答，C语言里面不可以声名函数，因为结构体就是一块连续的内存。函数的定义一般在class里面或者全局某个地方。所以，c语言struct的特性，不能声明，定义函数。但是，可以声名函数指针，因为函数指针，其实也是一个变量，在32位机器上就是四个字节，就跟普通的 四字节的int 没有什么区别，只不过描述的类型不一样，一个是整型，一个是函数指针。我们可以在c的struct里面这样定义结构体函数指针。
struct student{
	char* name;
]]></description><category></category></item><item><title><![CDATA[c++头文件的作用与使用方法以及extern 关键字的作用]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/110942554</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/110942554</guid><author>aLLLiyyy</author><pubDate>Wed, 09 Dec 2020 23:09:15 +0800</pubDate><description><![CDATA[cpp的头文件就是以.h结尾的文件。里面可以声明一些方法或者是全局变量。
所谓全局变量，就是没有在方法或或者类外部的变量。
注意是声明，声明一个变量前面要加上extern 表示它只是声明 具体的定义，赋值，可以在cpp文件中操作。
声明一个函数就是只写函数头。也就是没有函数体，大括号就是函数体。
为什么不能定义全局变量和函数呢？因为，如果这个头文件被多个cpp文件引用的话，就可能出现LINK1169 错误，找到一个或多个重定义的符号。
比如这样，我们在header里面定义了一个全局变量。
header.h
]]></description><category></category></item><item><title><![CDATA[Python参数之self，可变参数*args ，**kwargs]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/109407845</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/109407845</guid><author>aLLLiyyy</author><pubDate>Sat, 31 Oct 2020 21:03:19 +0800</pubDate><description><![CDATA[众所周知，定义一个函数需要传进去参数，那，假如参数个数不固定，意思就是定义时候，根本不知道要传递几个参数进去，该怎么办呢？这个时候，可变参数就派上用场了。
我们可以使用*args与**kwargs来作为形参，定义函数。
*arg的使用
def func_1(*kk):
    print(kk, type(kk))


if __name__ == "__main__":
    func_1(1, 5, 'ops')
'''
打印结果如下：
(1, 5, 'ops') &lt;class 'tuple'&]]></description><category></category></item><item><title><![CDATA[网页渲染数学公式之KaTeX引入]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/108914167</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/108914167</guid><author>aLLLiyyy</author><pubDate>Sat, 03 Oct 2020 22:41:05 +0800</pubDate><description><![CDATA[KaTeX可以排版复杂的数学公式，在网页上直接应用公式文字而不是图片是一个不错的选择。
1.首先引入对应KaTeX的css样式，js脚本文件。
  &lt;head&gt;
   &lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4]]></description><category></category></item><item><title><![CDATA[c++通过指针的偏移访问二维数组]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/108424234</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/108424234</guid><author>aLLLiyyy</author><pubDate>Sat, 05 Sep 2020 20:41:15 +0800</pubDate><description><![CDATA[int arr[2][2] = { {1,2},{3,4} };
	for (int i = 0; i &lt; 2; i++) {
		for (int j = 0; j &lt; 2; j++) {
			cout &lt;&lt; *((*(arr + i)) + j) &lt;&lt; endl;;
		}
	}
	cout &lt;&lt; typeid(*arr).name() &lt;&lt; endl;//int [2]

通过代码可以看到，通过指针的偏移，然后再通过解引用符号（）也可以访问]]></description><category></category></item><item><title><![CDATA[C++迷途指针（dangling pointer）与野指针]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/106008805</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/106008805</guid><author>aLLLiyyy</author><pubDate>Fri, 08 May 2020 23:20:14 +0800</pubDate><description><![CDATA[1.野指针是指没有初始化的指针，如下：
#include&lt;stdio.h&gt;
int main(int argc,char * argv[]){
	int *p;
	return (*p&amp;0x7f);
}

显然，这个指针p没有初始化就使用了，我们称这种指针为野指针（wild pointer）；
2，迷途指针（悬空指针）（dangling pointer）：
#include &lt;stdio.h&gt;
int main(int argc,char *argv[]){

  int *]]></description><category></category></item><item><title><![CDATA[C++中的运算符重载概念与注意事项]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/106007296</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/106007296</guid><author>aLLLiyyy</author><pubDate>Fri, 08 May 2020 22:17:56 +0800</pubDate><description><![CDATA[所谓运算符重载，就是让运算符有特殊的含义。
传统的运算符包括但不限于以下几种：
1算术运算符（+，-，，/，%，++，–）；
2逻辑运算符（&amp;&amp;,||,!）
3关系运算符(==,!=,&gt;=,&lt;=,&gt;,&lt;)
4赋值运算符(=,+=,-=,=,/=,%=,&gt;&gt;=,&lt;&lt;=,&amp;=,|=,^=)注意没有~=
5位运算符（&amp;，|，^,~,&lt;&lt;,&gt;&gt;）
6杂项运算符(包括取地址符号&amp;，解引用符号*，三目运算符？]]></description><category></category></item><item><title><![CDATA[shell 脚本 失败自动重复执行]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/103184367</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/103184367</guid><author>aLLLiyyy</author><pubDate>Thu, 21 Nov 2019 16:10:03 +0800</pubDate><description><![CDATA[在我们通过terminal 与linux系统交互的时候，经常会用到一些命令。然而有些命令是耗时操作的，比如我要举例的同步下载命令。我们不可能几个小时守在电脑旁边等着命令执行结束再进行一些操作。更可恨的是，命令有可能执行失败，这时候需要重新执行。我们需要一个能够接收到上一次命令的结果，然后根据结果做相应的处理，比如重新开始命令等等。
代码如下
#！/bin/bash
repo sync
echo "...]]></description><category></category></item><item><title><![CDATA[git config 命令详解]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/103068178</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/103068178</guid><author>aLLLiyyy</author><pubDate>Thu, 14 Nov 2019 16:07:01 +0800</pubDate><description><![CDATA[git config 命令主要与git的一些配置有关联的。
git config --list

这个命令可以列出关于当前git的所有配置信息，命令输出如下所示：
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
credential.helper=manager
...]]></description><category></category></item><item><title><![CDATA[c 语言中宏参数的字符串化跟宏参数的连接]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/103050249</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/103050249</guid><author>aLLLiyyy</author><pubDate>Wed, 13 Nov 2019 16:09:21 +0800</pubDate><description><![CDATA[c语言中的宏有无参数的宏，也有带参数的宏。
其实宏就相当与一个字符串模板，然后预处理器在有宏的标志处，把宏展开，说明白点，也就是字符串的替换工作。不过这个工作发生在编译之前，以前一直不理解，感觉c语言中的宏有多高大上，原来只是对你的c代码进行一些字符串的替换工作，替换后，还是c语言，然后才开始编译成汇编等指令。
现在说说如何定义一个有参数的宏，比如最简单的宏定义
#define MAX(a,b) ...]]></description><category></category></item><item><title><![CDATA[C++命名空间的定义与使用]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102960657</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102960657</guid><author>aLLLiyyy</author><pubDate>Thu, 07 Nov 2019 18:56:32 +0800</pubDate><description><![CDATA[众所周知std是一个命名空间，它里面可以定义一系常量，变量跟函数，最简单的命名空间的定义如下：
namespace Output {
	int i = 10;
	const int con = 15;
	void printStr() {
		printf("hello");
	}
}
using namespace Output;

上面定义了一个Output的命名空间，里面分别有一个常量，变量...]]></description><category></category></item><item><title><![CDATA[c++成员函数指针的定义与简单使用]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102912923</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102912923</guid><author>aLLLiyyy</author><pubDate>Tue, 05 Nov 2019 11:50:00 +0800</pubDate><description><![CDATA[在刚接触c++时候，我们会碰到这种操作符号，
.*  or  -&gt;*

这两个运算符是什么意思呢？其实就是取一个类的成员变量。当然，在使用成员变量的前提是你得先有成员变量。接下来，我们展示如何定义一个成员变量并且使用它
#include "pch.h"
#include &lt;iostream&gt;
#include &lt;vector&gt;
USING_NS
class Perso...]]></description><category></category></item><item><title><![CDATA[c++用指针创建二维数组]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102888262</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102888262</guid><author>aLLLiyyy</author><pubDate>Sun, 03 Nov 2019 22:49:00 +0800</pubDate><description><![CDATA[先上一个简单的代码，对比一下普通的声明数组，与用指针声明数组
	int a0[10];
	for (int i = 0; i &lt; sizeof(a0)/sizeof(*a0); i++)
	{
		a0[i] = i;
	}
	for (int i = 0; i &lt; sizeof(a0) / sizeof(*a0); i++)
	{
		cout &lt;&lt; "  " &lt;&...]]></description><category></category></item><item><title><![CDATA[c++ 中函数形参没有变量名]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102883575</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102883575</guid><author>aLLLiyyy</author><pubDate>Sun, 03 Nov 2019 16:16:09 +0800</pubDate><description><![CDATA[在c++中，有时候会看到这样的函数
int add(int,int);

这一看，不知道是什么意思，为什么形参没有参数名？
正常的情况应该是这样的
int add(int a,int b);

这是由于没有形参名的函数只用来声明，然而到定义的时候，必须有形参名称。类似这样：
int add(int, int);
int main()
{   
	cout &lt;&lt; add(100, 100...]]></description><category></category></item><item><title><![CDATA[c结构体中定义的成员指针赋值与结构体指针作为成员函数参数的使用]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102881787</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102881787</guid><author>aLLLiyyy</author><pubDate>Sun, 03 Nov 2019 13:44:21 +0800</pubDate><description><![CDATA[c语言定义结构体可以直接声明结构体变量的，如下
struct Student{
char *name;
int age;
}xiaoming

这样以来，我们就定义了一个结构体类型，同时声明了一个结构体变量xiaoming。那么。我们在main函数中怎样对这个结构体进行初始化呢？
可以这样
int main()
{   
	xiaoming.age = 15;
	xiaoming.name = (...]]></description><category></category></item><item><title><![CDATA[c++ typedef 关键字与 typedef struct]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102733153</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102733153</guid><author>aLLLiyyy</author><pubDate>Thu, 24 Oct 2019 22:11:41 +0800</pubDate><description><![CDATA[c++中，经常有一些莫名的数据类型，不像java等，数据类型都是明明白白写出来的，比如 int long char等等。然而c++，可以对数据类型进行重命名，这样，你就可以自己命名你需要的数据类型了。最简单的例子
int main()
{
	typedef int alias;
	alias i = 100;
	cout &lt;&lt; i &lt;&lt; endl;
	return 0;
}...]]></description><category></category></item><item><title><![CDATA[C++成员函数指针的定义与使用]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102701214</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102701214</guid><author>aLLLiyyy</author><pubDate>Wed, 23 Oct 2019 15:13:42 +0800</pubDate><description><![CDATA[成员函数指针是相对于对象来说的，在说成员函数指针之前，先要明白普通函数指针的定义与使用。
用vs先建立一个项目，名称随意，然后在源文件中声明并且定义一个函数，代码如下：
#include "pch.h"
#include &lt;iostream&gt;
using namespace std;
int add(int a,int b) {
	return a + b;
}

int main()...]]></description><category></category></item><item><title><![CDATA[WIRESHARK基础教程以太帧的分析。]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102104119</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/102104119</guid><author>aLLLiyyy</author><pubDate>Mon, 07 Oct 2019 00:16:46 +0800</pubDate><description><![CDATA[首先应该明白，封装以太帧的位于OSI七层模型的第二层，也就是数据链路层，wireshark可以把完整的以太帧抓起来，我们可以清楚的看到。打开wireshark找到自己ip对应的网卡，点开，随便点一个协议，这里以UDP协议为例子，截图如下
上面用红笔写的1，2，3，4分别对应 1：以太帧总信息，2：以太帧头部，3：IP 数据包，4：UDP数据包。他们是有联系的，且看我在下面解释。
第一个解释，Fra...]]></description><category></category></item><item><title><![CDATA[android layerlist 里面的rotate标签得到三角形原理详解]]></title><link>https://blog.youkuaiyun.com/aLLLiyyy/article/details/101125508</link><guid>https://blog.youkuaiyun.com/aLLLiyyy/article/details/101125508</guid><author>aLLLiyyy</author><pubDate>Sun, 22 Sep 2019 00:47:02 +0800</pubDate><description><![CDATA[在android 中。有各种各样的drawable。其中，比较常用的drawable有一个LayerDrawable,对应的xml标签为layerlist。里面可以按照先后顺序，放置一个个i的item。就像这样：
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;layer-list xmlns:android="http://schemas.and...]]></description><category></category></item></channel></rss>