C++知识点

来源:互联网 发布:战斗妖精雪风模型淘宝 编辑:程序博客网 时间:2024/06/05 19:29
  • 关于strlen
    void test3(char* str1){ if(str1 == NULL){        return ; } char string[10]; if( strlen( str1 ) <= 10 ) { strcpy( string, str1 ); }}
    应将<=改为=,strlen结果不统计"\0"。
  • 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的值
    void Func ( char str[100] ){ sizeof( str ) = ?}void *p = malloc( 100 );sizeof ( p ) = ?
    sizeof(str)=4;
    sizeof(p)=4;
    数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,还失去了其常量属性,可以作自增、自减等操作,可以被修改。
    数组名本质如下:
  • 数组名指代一种数据结构,这种数据结构就是数组:
    char str[10];cout<<sizeof(str)<<endl;
    输出结果为10,str指代数据结构char[10];
  • 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改。
    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++)<=(b)? (*p++):(b))
    指针p会做2次自增操作;
  • 零值判断
    if(!var)   //BOOL,是逻辑判断if(var==0)  //int const float EPSINON=0.00001;if((x>=-EPSINON)&&(x<=EPSINON)  //floatif(var==NULL)  //指针变量




原创粉丝点击