- 关于strlen
应将<=改为=,strlen结果不统计"\0"。void test3(char* str1) { if(str1 == NULL){ return ; } char string[10]; if( strlen( str1 ) <= 10 ) { strcpy( string, str1 ); } }
- strcpy函数的实现
//strcpy函数 char *strcpy(char *strDest,const char *strSrc)//用const修饰源字符串,防止修改源字符串; { assert((strDest!=NULL)&&(strSrc!=NULL));//检查指针的有效性,保证代码健壮; char *address=strDest; while((*strDest++==*strSrc++)!='\0') NULL;//用NULL代替0,如果出现拼写错误,编译器会检查出来; return address;//为了实现程序的链式表达 }
str与所指内存区域不可以重叠且必须有足够的空间来容纳src的字符串;- 注意内存重叠问题
- strcpy和memcpy的区别
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如,字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,遇到被复制字符的串结束符“\0”才结束,所以容易溢出,memcpy是根据第三个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制爱其他类型数据一般用memcpy。- 关于数组名
以下为Windows NT下的32位C++程序,请计算sizeof的值
sizeof(str)=4;void Func ( char str[100] ) { sizeof( str ) = ? } void *p = malloc( 100 ); sizeof ( p ) = ?
sizeof(p)=4;
数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,还失去了其常量属性,可以作自增、自减等操作,可以被修改。
数组名本质如下:
- 数组名指代一种数据结构,这种数据结构就是数组:
输出结果为10,str指代数据结构char[10];char str[10]; cout<<sizeof(str)<<endl;
- 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改。
char str[10]; str++;//编译出错,提示str不是左值;
- 数组名作为函数形参时,沦为普通指针;
windowsNT 32平台下,指针长度(占内存大小)为4字节。故sizeof(str),sizeof(p)均为4;- 宏定义
宏定义可以实现类似于函数的功能,但是终归不是函数,而宏定义中括弧的“参数”也不是真的参数,在宏展开的 时候对“参数”是一对一的替换。//写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A)<=(B)? (A):(B))
所以使用宏定义要注意:- 要将宏定义中的“参数”和整个宏用括号括起来,只有注意宏后面没有分号“;”
- 防止宏的副作用;
宏定义:对于MIN(*p++, b);
指针p会做2次自增操作;((*p++)<=(b)? (*p++):(b))
- 零值判断
if(!var) //BOOL,是逻辑判断 if(var==0) //int const float EPSINON=0.00001; if((x>=-EPSINON)&&(x<=EPSINON) //float if(var==NULL) //指针变量
C++知识点
最新推荐文章于 2023-06-05 19:52:30 发布