一、malloc/free与new/delete区别
1、malloc/free是C++/C语言的标准库函数,new/delete是C++运算符、保留字
2、malloc/free不受编译器控制,像C++类的构造、析构函数与内存的动态申请与释放同步执行,它两指望不上;那么我们申请内存时初始化一些变量,释放内存时释放一些其它资源,我们就得靠new/delete
3、不论两者课本上的区别有多少,我会专心用好new/delete派对,如果看到malloc/free派对我也是喜闻乐见
二、引用和指针的区别
1、引用必须创建时初始化,而指针随便你,但我经常创建指针时也初始化
2、引用和引用标的一旦关系绑定则不可变更,指针可以随时变更所指对象
3、引用的功能指针都能干,但有时我们也乐于使用引用
三、静态变量和静态成员函数的理解
我的使用心得:存在即合理,在使用多线程时有时我会使用静态成员函数作为线程函数,在需要传递函数指针作为参数时(回调函数)我也会使用类的静态成员函数;静态函数属于类,一般的函数属于类的实例; 函数体外的静态变量相当于一个全局变量可以被当前文件的所有函数访问;
四、memcpy和strcpy
char buffer[8] = {0x31,0x36,0x38,0x38,0x30,0x00,0x39,0x38};
char buff1[6], buff2[6], buff3[6];
// memcpy(buff1, buffer, 6);
// memcpy(buff3, buffer, sizeof(buffer)); //buff3溢出
// strcpy(buff2, buffer);
//buff1和buff2的内容都是:16880 即:0x31,0x36,0x38,0x38,0x30,0x00
//注意:两者都是C语言标准库函数;
//区别:1、复制的内容不同,strcpy仅复制字符串,memcpy可以复制字符数组、整型、结构、类等
// 2、复制的方法不同,strcpy不需指定长度,遇到'\0' 结束,memcpy则根据第3参数决定复制长度
// 3、用途不同,strcpy通常在复制字符串时用,memcpy则用途更广泛
// strcpy仅仅是拷贝字符串,遇到'\0'(nul)结束;<-它还会复制结束符
// memcpy是拷贝内存数据,不管内容是什么;即拷贝2参的3参个长度到1参
// 此例要注意第3个参数不要超过buff1的长度,否则会引起内存溢出,
// 所以一般我们sizeof(buff1),而不是sizeof(buffer)
4.1、详解 strcpy
#include <stdio.h>
//实现获取strSrc字符串的长度
long getStrLen(const char *strSrc)
{
//保存长度
long len = 0;
//循环直到遇见结束符'\0'为止
while(*strSrc++ != '\0')
{
len++;
}
return len;
};
// 实现strSrc到strDest的复制
char * strcpy(char * strDest, const char * strSrc)
{
//判断参数strDest和strSrc的有效性
if ((strDest == NULL) || (strSrc == NULL)) return NULL;
//保存目标字符串的首地址
char * strDestCopy = strDest;
//把strSrc字符串的内容复制到strDest下;注意尺寸受'\0'限制
while( (*strDest++ = *strSrc++) != '\0' );
return strDestCopy;
/*
为什么要返回char*
解析:主要是为了链式表达式的便利,例如你可以在程序中这样调用
long len = getStrLen(strcpy(buff1, buffer)); //len==5,先复制再计算长度
*/
}
4.2、详解 memcpy
#include <stdio.h>
#include <assert.h>
void * memcpyX(void * dest, const void * src, unsigned long size)
{
assert((dest != NULL) && (src != NULL)); //dest和src必须有效
char *tempSRC = (char *)src; //保存src首地址
char *tempDEST = (char *)dest; //保存dest首地址
//循环size次,复制tempSRC的值到tempDEST中;注意尺寸受size限制
while( size-- > 0 )
*tempDEST++ = *tempSRC++;
return dest; //memcpyX(buff1, buffer, 6);
}
五、ASCII码表
ASCII:0 十进制:48 十六进制:0x30
ASCII:A 十进制:65 十六进制:0x41
ASCII:a 十进制:97 十六进制:0x61
ASCII:nul 十进制:0 十六进制:0x00