C/C++笔试题总结——持续更新中

1. 实现String类

已知类String的原型为:

class String

{

 public

     String(const char *str = NULL);            //普通构造函数

     String(const String &);                //拷贝构造函数

     ~String(void);                             //析构函数

     String & operator = (const String &);  //赋值构造函数

 private:

     char * m_data;                             //用于保存字符串

};

请编写String的上述4个函数。

参考:C++中String类的实现

 

2. 将一个字符串逆序输出。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>//for malloc

int main(){
    char s[20]="Hello world!";
    int n=strlen(s);
    char *p=(char*)malloc((n+1)*sizeof(char));
    char *a, *b;
    a=p;
    b=&s[n-1];
    while(n-1>=0){
        *a++=*b--;
        n--;
    }
    *a='\n';
    printf(p);
    free(p);
    return 0;
}

 

3.关于sizeof(),strlen()

char s[20]="Hello world!"

char *p="12345";

 

sizeof(s) //20
strlen(s) //12,不包括结尾的‘\0’
sizeof(s[0]) //1 s[0]==‘H’
sizeof(p) //8 p 是一个char*
sizeof(*p) //1 *p='H'
strlen(p) //5

这里首先要弄清楚各个数据类型的长度。sizeof()函数返回的是值的单位是字节。

各个类型的变量长度由编译器来决定(实际上与操作系统位数和编译器都有关)使用时可用sizeof()得到,当前主流编译器一般是32位或64位。
类型      32位  64位
  char       1    1
  short int    2    2
  int       4    4
  long int     4    8
  long long int  8    8
    char*       4    8
  float      4    4
  double      8    8

4. 关于i++和++i

   int i=1;
   printf("%d %d %d %d",i++,++i,i++,++i);//返回值为4 5 2 5。
   
   这里需要弄清楚两点:1)首先参数列表从右向左计算各个表达式的值;2)++i返回的是一个引用(增1后的i的引用),而i++返回的是i本身
   首先从右向左计算:
   ++i 返回i的引用,此时i==2
   i++ 返回i本身,返回i==2 之后i+1
   ++i 返回i的引用,此时i==4
   i++ 返回i本身,返回i==4 之后i+1
   然后依次将这些参数的返回值压入栈,++i的返回值为i的引用,注意此时i==5,所以将5压入栈中, 然后i++ 返回2, ++i返回5, i++返回4, 然后依次出栈, 4,5,2,5
   *****注意以上分析仅仅是基于VS来将的,对于不同的编译器可能会有不同的结果。

 

5. 关于c和c++中的const的区别

同样一段代码,在c编译器下,打印结果为*pa =  4, 4

在c++编译下打印的结果为 *pa = 4, 8

原因可以参考 2.1 题的解释。

int main(void)
{
    const int a = 8;
    int *pa = (int *)&a;
    *pa = 4;
    printf("*pa = %d, a = %d", *pa, a);
    return 0;
}

另外值得一说的是,由于c++中const常量的值在编译期就已经决定,下面的做法是OK的,但是c中是编译通不过的。

int main(void)
{
    const int a = 8;
    const int b = 2;
    int array[a+b] = {0};
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值