面试题答案
一键面试- *func1(const char str) 与 func2(char * const str) 的区别
- 功能区别:
void func1(const char *str)
:const char *
表示指向常量字符的指针,即指针指向的内容不能通过这个指针修改,但指针本身可以指向其他内存地址。这意味着函数func1
可以读取str
指向的字符串内容,但不能修改它。void func2(char * const str)
:char * const
表示指针本身是常量,即一旦指针初始化指向某个内存地址,就不能再让它指向其他地方,但可以修改指针指向的内容。所以函数func2
可以修改str
指向的字符串内容,但不能改变str
指向的地址。
- 使用场景区别:
func1(const char *str)
的场景:当函数只需要读取字符串内容,而不需要修改它时,使用const char *
。例如,在字符串查找、字符串打印等操作中,只需要读取字符串的信息,不需要改变字符串本身。func2(char * const str)
的场景:当函数需要修改字符串内容,并且在函数执行过程中不希望改变指针指向的地址时,使用char * const
。比如在原地对字符串进行加密、解密操作,或者字符串格式化操作等,只需要在原字符串上进行修改。
- 功能区别:
- *何时使用 const char p 与 char * const p 作为参数
- *使用 const char p 的场景:
- 示例代码:
- *使用 const char p 的场景:
#include <iostream>
void printString(const char *str) {
std::cout << str << std::endl;
}
int main() {
const char *s = "Hello, World!";
printString(s);
return 0;
}
- 在上述代码中,`printString` 函数只需要读取字符串并打印,不需要修改字符串内容,所以使用 `const char *` 作为参数。这样可以防止函数内部意外修改字符串,提高程序的安全性。
- 使用 char * const p 的场景:
- 示例代码:
#include <iostream>
void reverseString(char * const str) {
int len = 0;
while (str[len] != '\0') {
len++;
}
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - 1 - i];
str[len - 1 - i] = temp;
}
}
int main() {
char s[] = "Hello";
reverseString(s);
std::cout << s << std::endl;
return 0;
}
- 在 `reverseString` 函数中,需要对字符串进行原地反转,即修改字符串内容,同时在函数执行过程中不需要改变指针 `str` 指向的地址,所以使用 `char * const` 作为参数。
3. 潜在问题及避免方法
- 使用 const char * 作为参数的潜在问题及避免方法:
- 潜在问题:如果在函数内部不小心尝试修改
const char *
指向的内容,会导致编译错误。例如:
- 潜在问题:如果在函数内部不小心尝试修改
void func1(const char *str) {
str[0] = 'a'; // 编译错误,不能修改 const 指向的内容
}
- **避免方法**:仔细编写代码,确保不尝试修改 `const char *` 指向的内容。同时,编译器会在编译阶段检查出这类错误,及时发现并修正。
- 使用 char * const 作为参数的潜在问题及避免方法:
- 潜在问题:如果在函数内部尝试改变
char * const
指针本身的指向,会导致编译错误。例如:
- 潜在问题:如果在函数内部尝试改变
void func2(char * const str) {
char newStr[] = "New String";
str = newStr; // 编译错误,不能改变 const 指针的指向
}
- **避免方法**:明确函数的需求,如果需要改变指针指向,就不要使用 `char * const`。编写代码时注意不要意外地改变指针指向,编译器同样会在编译阶段发现这类错误。