面试题答案
一键面试字符常量初始化方式
在C++中,字符常量是用单引号括起来的单个字符。其初始化方式如下:
char ch = 'a';
这里将字符'a'
赋值给变量ch
。
字符串常量初始化方式
字符串常量是用双引号括起来的零个或多个字符序列,并且会自动在末尾添加一个空字符'\0'
。初始化方式有以下几种:
- 使用字符串字面量初始化字符数组:
char str1[] = "hello";
- 使用指针指向字符串字面量:
const char* str2 = "world";
这里使用const
修饰指针指向的内容,因为字符串字面量是常量,不能被修改。
内存存储区别
- 字符常量:字符常量在内存中只占一个字节,存储的是该字符对应的ASCII码值。例如,
'a'
在内存中存储的是97(十进制)。 - 字符串常量:字符串常量在内存中占用的字节数是字符串中字符个数加上1(用于存储末尾的
'\0'
)。例如,字符串"hello"
在内存中占用6个字节,依次存储'h'
、'e'
、'l'
、'l'
、'o'
、'\0'
的ASCII码值。
错误使用导致运行错误的原因
- 字符常量错误使用:如果将字符常量当作字符串使用,例如试图用
cout
直接输出字符常量,它会输出该字符对应的ASCII码值,而不是像字符串那样按字符逐个输出。
char ch = 'a';
// 下面的输出会是97('a'的ASCII码值)
cout << ch << endl;
- 字符串常量错误使用:
- 试图修改字符串字面量:当使用指针指向字符串字面量时,若试图修改其内容会导致运行错误。例如:
const char* str = "hello";
// 下面这行代码会导致编译错误,因为不能修改字符串字面量
// str[0] = 'H';
- **数组越界**:在处理字符串时,如果没有正确处理`'\0'`,可能会导致数组越界。例如:
char str[] = "hello";
// 错误地遍历到数组外,因为没有考虑'\0'
for (int i = 0; i <= 5; ++i) {
cout << str[i];
}
这样可能会访问到未初始化的内存,导致程序崩溃或出现未定义行为。