C/C++基础面试题整理

1.sizeof

sizeof(0) == sizeof(int)
sizeof(0L) == sizeof(long)
sizeof(0LL) == sizeof(long long)

int array[5]; sizeof(array) == sizeof(int) * 5

2.大端小端

大端低字节高地址,高字节低地址;小端低字节低地址,高字节高地址(TCP/IP)采用大端

某32位数据在内存中的布局为(左为低地址)

大端读数为0x12345678;小端读数为0x78563412

 

4.结构体和数组当作参数传递到函数

结构体会拷贝一个副本给函数,在函数内的修改对原始数据不产生影响;

数据传递的是首地址,函数内的修改对原始数据有影响。

 

5.C宏

定义一年有几秒(忽略瑞年)

#define SECONDS_PER_YEAR (365 * 24 * 60 * 60)UL

二数求小的宏

#define MIN(x, y) ((x) > (y) ? (y) : (x))

 

6.C中基本类型的定义

a) int a; // An integer 

b) int *a; // A pointer to an integer 

c) int **a; // A pointer to a pointer to an integer 

d) int a[10]; // An array of 10 integers 

e) int *a[10]; // An array of 10 pointers to integers 

f) int (*a)[10]; // A pointer to an array of 10 integers 

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer 

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

 

7.关键字static的作用

1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

4). 在类内,静态函数表示不需要实例就可以调用

 

8. 引用与指针的区别

1) 引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

2) 不存在指向空值的引用,但是存在指向空值的指针.

 

9.死循环的写法

1while(1){}

2) for(;;){}

3)Loop:{}goto Loop;

 

10.C++ String类的实现

#include <iostream>

#include <string.h>

using std::ostream;

class String {
    friend ostream& operator<<(ostream& out, const String& str);

    public:
        String(const char* str);        //Constuctor
        String(const String& other);        
        ~String(void);
        String& operator=(const String& other);
        char* data(void) const;
    private:
        ostream& Print(ostream& out) const;
        char* _data;
};

ostream& operator<<(ostream& out, const String& str)
{
    return str.Print(out);
}

String::String(const char* str)
{
    if (str == NULL) {
        _data = new char[1];
        // if _data == NULL throw Exception
        _data[0] = '\0';
    } else {
        size_t len = strlen(str);
        _data = new char[len + 1];
        // if _data == NULL throw Exception
        strcpy(_data, str);
    }
}

String::~String(void)
{
    delete[] _data;
}

String& String::operator=(const String& other)
{
    if (this != &other) {
        delete[] _data;
        size_t len = strlen(other.data());
        _data = new char[len + 1];
        // if _data == NULL throw Exception
        strcpy(_data, other.data());
    }
    return *this;
}

char* String::data(void) const
{
    return _data;
}

ostream& String::Print(ostream& out) const
{
    out << _data;
    return out;
}

 11. C++ new

new函数可以重载;

new操作符不可以重载。

 

12. 枚举

枚举只能是整型,值会自动连续

 enum e {
         A = -5,
         B,
         C = 3, 
         D, 
         E = -8, 
         F};
 printf("%d, %d, %d, %d, %d, %d", A, B, C, D, E, F);

// 输出-5 -4 3 4 -8 -7

 13.memcpy, memmove, strcpy 实现

void* memcpy(void* dest, const void* src, size_t n)
{
      char* d = (char*) dest;
      const char* s = (const char*) src;
      
      while (n--)
            *d++ = *s++;
      return dest;
}

void* memmove(void* dest, const void* src, size_t n)
{
      char* d = (char*) dest;
      const char* s = (const char*) src;
      
      if (s > d) {            // start at beginning of s
            while (n--)
                  *d++ = *s++;
      } else if (s < d) {     // start at end of s
             d = d + n - 1;
             s = s + n - 1;
             while (n--)
                   *d-- = *s--;
      }
      return dest;
}

char* strcpy(char* dest, const char* src)
{
      assert(dest);
      assert(src);
      char* d = dest;
      const char* s = src;
      
      while (*str != '\0')
            *d++ = *s++;
      *d = '\0';
      return dest;
}

 

posted @ 2013-06-24 19:31  Leo Forest  阅读(405)  评论(0编辑  收藏  举报