- 博客(55)
- 资源 (1)
- 收藏
- 关注
原创 C++指针比较
指针str5、str6、str7、str8也是在栈中分配的,他们都是指向“abc”字符串,注意abc存放在数据区,所以str5、str6、str7、str8其实指向同一块数据区的内存。因此17,18,19输出的都是1.数组str1、str2、str3、str4都是在栈中分配的,内存中的内容都为“abc”加一个“\0”,但是他们的位置是不同的,因此代码第15行和第16行输出的都是0.内存中各个数据的存放方式。
2024-01-31 13:11:13
401
原创 OpenWrt版本更迭说明
OpenWrt 12.09:2012年发布,引入了“Attitude Adjustment”代码名称,改进了IPv6支持和网络配置。OpenWrt 15.05:2015年发布,引入了“Chaos Calmer”代码名称,增强了网络管理和IPv6支持。OpenWrt 10.03:2010年发布,引入了“Backfire”代码名称,添加了多个硬件平台的支持。OpenWrt 8.09:2009年发布,引入了“Backfire”代码名称,添加了多个硬件平台的支持。OpenWrt 0.9:2004年发布的最初版本。
2023-12-29 10:56:58
727
原创 openwrt源码编译
当前我们基于15.05版本开发,如果开发者想用最新的OpenWRT系统,可以下载 https://github.com/openwrt/openwrt.git。git clone https://github.com/openwrt/chaos_calmer.git // 官方下载地址。/target : 构建imagebuilder,内核,sdk和工具链所需的生成文件和配置。/toolchain : 构建工具链所需的生成文件和配置。/package : 用于文件生成和菜单配置的软件包。
2023-12-28 21:13:42
787
原创 复杂指针的声明
func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有一个括号,那么func是一个指向函数的指针,这类函数具有int*和int (*)(int*)这样的形参,返回值类型为int类型。首先找到那个未定义的标识符func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。
2023-12-17 10:48:20
502
原创 为什么传引用比传指针安全
对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或者为NULL,所以不安全。const指针仍然存在空指针,并且有可能产生野指针。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。
2023-12-01 12:45:20
377
原创 指针和引用的区别
实际上,在语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的。只不过编译器帮我们完成了转换。总体来说,引用既具有指针的效率,又具有变量使用的方便性和直观性。
2023-12-01 12:42:36
376
原创 如何交换两个字符串
如果不用指针引用,那么指针交换只能在swap函数中有效,因为在函数体中,函数栈会分配两个临时的指针变量分别指向两个指针参数。对实际的ap和bp没有影响。这里swap函数是利用传指针引用实现字符串交换的。由于swap函数是指针引用类型,因此传入的函数就是实参,而不是形参。
2023-12-01 12:28:28
882
原创 指针变量引用
代码第16行,将pa指向的内容加1。由于pa是p的引用,所以此时实际上是对p指向的内容加1,也就是b加1,结果为b变成了12;代码第10行,将pa指向的内容加1。由于pa是p的引用,所以此时实际上是对p指向的内容加1,也就是a加1,结果为a变成了2;代码第15行,将pa指向变量b的地址。由于pa是p的引用,所以此时p也指向了b的地址;代码第5行和第6行,整型变量a和整型变量b分别被初始化为1和10;代码第7行,声明整型的指针变量p并且初始指向a;代码第8行,声明p的一个指针引用pa;
2023-12-01 12:11:32
358
原创 一般变量引用
代码第21行,将a的地址与rn的地址进行了比较,如果相等,变量equal的值为1,否则为0。rn和a占内存中的同一个存储单元,它们具有同一个地址,所以equal为1。代码第12行,将rn的值赋为b的值。此时rn其实就是a的一个别名,对rn的赋值其实就是对a赋值。因此执行完赋值后,a的值就是b的值,即都是20.代码第7行和第8行,整型变量a和整型变量b分别被初始化为10和20。代码第16行,将rn的值赋为100,于是a的值变成了100.代码第9行,声明rn为变量a的一个引用。
2023-12-01 11:06:04
354
原创 内联函数与宏有什么区别
内联函数在编译时展开,宏在预编译时展开。 在编译的时候,内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的文本替换。 内联函数可以完成诸如类型检查,语句是否正确等编译功能,宏就不具备这样的功能。 宏不是函数,inline函数时函数。 宏在定义时要小心处理宏参数,否则容易出现二义性。而内联函数定义时不会出现二义性。
2023-11-30 22:20:56
368
原创 为什么不把所有的函数都定义成内联函数
内联是以代码膨胀为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。所以,不要随便地将构造函数和析构函数的定义放在类的声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联。
2023-11-30 22:06:50
470
原创 内联函数使用的场合
内联函数在C++类中应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。首先使用inline函数可以完全取代表达式形式的宏定义。
2023-11-30 21:43:52
394
原创 为什么inline能很好的取代表达式形式的预定义
inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,没有了调用的开销,效率也很高。 类的内联函数也是一个真正的函数。编译器在调用一个内联函数时,首先会检查它的参数的类型,保证调用正确;然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。 inline可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。
2023-11-30 21:16:03
377
原创 为什么要引入内联函数
这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此效率很高。这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处。另外,它的返回值也不能被强制转换为可以转换的合适类型,这样,它的使用就存在着一系列的隐患和局限性。在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及类的保护成员或者私有成员,你就不可能使用这种宏定义来实现。
2023-11-30 18:17:20
428
原创 #pragma pack的作用
代码第3行用#pragma pack将对齐设置为1。由于结构体test中的成员s1,s2和i的自身对齐分别为2,2和4,都是小于1。因此他们都是用1作为对齐,sizeof(test)=1+2+2+4=9。如果注释代码第3行,则编译器默认的对齐为8。所以各个成员的对齐都小于8,因此他们使用自身的对齐,sizeof(test)=1+1(补齐)+2+2+2(补齐)+4=12。
2023-11-30 14:35:32
346
原创 sizeof有哪些用途
与存储分配和IO系统那样的例程进行通信。 查看某个类型的对象在内存中所占的单元字节。 在动态分配一个对象的时候,可以让系统知道要分配多少内存。 便于一些类型的扩展,在window系统中很多结构类型就有一个专用的字段是用来放该类型的字节大小的。 由于操作数的字节数在实现时可能出现变化,建议在涉及操作数字节大小的时候用sizeof来代替常量的计算。 如果操作数是函数中的数组形参或者函数类型的形参,则sizeof给出其指针的大小。
2023-11-29 17:07:21
421
原创 sizeof与strlen有哪些区别
sizeof是操作符,strlen是函数。 sizeof操作符的结果类型是size_t,它在头文件中typedef为unsignedint类型,该类型保证能容纳实现所建立的最大对象的字节大小。 sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以"\0"结尾的。 数组做sizeof的参数不退化,传递给strlen就退化为指针了。 大部分编译程序在编译的时候sizeif就被计算过了,这就是sizeof(x)可以用来定义数组维数的原因。strlen的结果要在运行的时候才能计算出来
2023-11-29 16:00:47
395
原创 使用sizeof计算含有虚函数的类对象的空间大小
普通函数不占用内存,只要有虚函数,就会占用一个指针大小的内存,原因是系统多用了一个指针维护这个类的虚函数表,并且注意这个虚函数无论含有多少项都不会再影响类的大小。前提条件:32位WinNT操作系统。
2023-11-27 19:16:05
408
原创 使用sizeof计算类对象所占用的空间大小
c1的偏移量为0,i的偏移量为4,c1和i之间便需要3个填充字节。c2的偏移量为8,加起来就是1+3+4+1,等于9个字节。由于这里最宽的基本类型为int,大小为4个字节,再补充3个字节凑成4的倍数。这样一共是12个字节。其他平台可能没有这种情况,但是最常见的是,如果不按照适合其平台的要求对数据存放进行对齐,会给存取的效率带来损失。通常,我们写程序的时候,不需要考虑对齐的问题。在对结构体或者类做sizeof运算的时候,不是简单的把各个成员所占的内存数量相加就可以了,需要考虑到字节对齐的问题。
2023-11-26 12:30:07
405
原创 使用sizeof计算普通变量所占空间大小
str是函数的参数,它在做sizeof运算时被认为是指针。这是因为当我们调用函数Fun(str)时,由于数组是"传址"的,程序会在栈上分配一个4字节的指针来指向数组,因此结果为4;str变量表示数组,对数组变量做sizeof运算得到的是数组占用内存的总大小。因此,第一个sizeof = strlen("hello")+1,结果为6;最后一个,p指向一个100字节的堆内存,这里还是对指针做sizeof运算,因此结果为4;p和n分别是指针和int型变量。在32位WinNT平台下,指针和int都是4个字节;
2023-11-26 11:44:22
489
原创 C++类的静态成员
当程序运行到第一次打印的时候,只有两个类widget实例,count = 2;运行到第二次打印的时候,又产生三个实例,count = 3;在运行到第三次打印的时候,运行到if判断结束后,前面增加的三个实例销毁,同时又增加一个,count = 3;类中的静态成员或者方法不属于类的实例,而属于类本身并在所有类的实例间共享。在调用它们时应该用类名加上操作符"::"来引用。在上面的代码中,widget构造方法中,把静态成员count的值加一,在widget的析构方法中,把静态成员count的值减一。
2023-11-26 11:19:34
392
原创 static全局变量与普通的全局变量有什么区别
这两者的区别在于,非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的;由于静态全局变量的作用域局限于一个源文件,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。static函数与普通函数的作用域不同。static函数的作用域仅在本文件,只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。
2023-11-26 10:50:39
495
原创 static有什么作用
在函数体,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变。 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有的函数访问,但不能被模块外其他函数访问。它是一个本地的全局变量。 在模块内,一个被声明为静态的函数只可以被这一模块内的其他函数调用,那就是这个函数被限制在声明它的模块的本地范围内使用。
2023-11-25 12:15:23
350
原创 C++中const有什么作用
第一个函数的效率低。函数体内产生A类型的临时对象用于复制参数a,临时对象的构造,复制,析构过程都将消耗时间。而第二个函数提高了效率。用引用传递不需要产生临时对象,节省了临时对象的构造,复制,析构过程消耗的时间。但是光引用有可能改变a,所以加const。const &传递,
2023-11-25 12:08:22
669
原创 C++面试,说明const和#define的特点和区别
当程序进行编译的时候。编译器会首先将"#define PI 3.1415926"以后所有代码中的PI都替换成3.1415926,然后进行编译。它的生命周期止于编译期,它存在于程序的代码段,在实际程序中它只是一个常数,一个命令中的参数,并没有实际的存在。const常量存在于程序的数据段,并且在堆栈分配了空间。const常量有数据类型,但是宏却没有,编译器可以对const常量进行类型的安全检查。
2023-11-25 11:46:02
679
原创 C++面试,const的使用
a1定义为const int* 类型,这里的const在int*的左侧,它是用来修饰指针所指向的变量,即指针指向为常量。a3定义为const int* const 类型,这里的两个const分别出现在int*的左侧和右侧,因此它表示不仅指针本身不能修改,并且其指向的内容也不能修改。所以关于a3的几个操作都是错误的。a2定于为int* const类型,注意这里的const在int*的右侧,它是用来修饰指针本身的,即指针本身为常量。所以a2=&c,这个操作是不可以的,但是*a2=1,修改了指向的内容是可以的。
2023-11-25 11:38:11
732
原创 C++面试,宏参数的连接
CONS(a,b)定义的是一个将参数a和b按照aeb连接起来的一个整型值。CONS(2,3)实际表示的就是整型值2e3,也就是十进制的2000。STR(s)定义的是一个参数s表示的字符串,STR(vck)实际表示就是字符串"vck"。
2023-11-25 10:46:55
412
原创 在C++中将`const char*`类型的字符串转换为`const unsigned char*`类型的字符串
在C++中,可以使用进行类型转换,将一个指针强制转换为另一个指针类型。上述代码将类型的指针强制转换为类型的指针。需要注意的是,这种方式只是进行了指针的类型转换,并未生成新的字符串,因此不需要手动管理内存。
2023-04-25 22:56:03
1395
原创 ardunio-IDE搭建esp8266开发环境
ardunio-IDE搭建esp8266开发环境打开Arduino,选择“首选项”,在“附加开发板管理器网址”中填入下面地址,点击确定保存。http://arduino.esp8266.com/stable/package_esp8266com_index.json打开工具->开发板->开发板管理器等待开发板管理器启动完成后,移动到开发板管理器的最下方,可以看到一个esp8266 by esp8266 Community,右下角有个选择最新版本安装,这个过程可能会很慢。下载完成之
2022-03-31 22:22:50
470
原创 Ubuntu安装tftpd服务器
sudo apt install tftpd-hpasudo vi /etc/default/tftpd-hpa# /etc/default/tftpd-hpa TFTP_USERNAME="tftp"TFTP_DIRECTORY="/home/shine/tftpdroot"TFTP_ADDRESS="0.0.0.0:69"TFTP_OPTIONS="-l -c -s"sudo service tftpd-hpa restart
2022-03-31 17:46:25
579
原创 Ubuntu安装samba服务器
系统环境,Ubuntu16,主机Windows10 安装指令sudo apt-get install samba samba-common修改smb.conf[shareDir] comment = video shared directories path = /home/dell public = yes browseable = yes writable = yes available = yes guest = ok create mask = 0777 direct
2022-03-15 09:20:49
128
shttpd-1.42
2020-11-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人