您的位置:首页 > 编程语言 > C语言/C++

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

2013-06-24 19:31 337 查看
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.死循环的写法

1)while(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: