C++知识点

  • 关于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)  //float
    if(var==NULL)  //指针变量




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值