1.char *str是一个指向字符或字符串的指针,总是指向一个字符的起始地址,例如
char *str = "Hello"; cout << *str << endl; // 输出:H cout << str << endl; // 输出:Hello str ="World"; //指针变量本身地址没有改变,只是改变了指针指向的常量字符串地址 cout<< str <<endl; //输出:World
2.char &str是一个字符的引用,可以看作是字符的别名,对引用的修改可以直接影响原始值,例如
char c = 'A'; char &str = c; cout << str << endl; // 输出:A str = 'B'; cout << c << endl; // 输出:B
对于函数中调用char *str和char &str的区别
#include <iostream> #include <cstring> using namespace std; void ModifyPointer(char *str) { str = "World"; // str是指向字符串的起始位置,而不是字符串本身,所以这样写是错误的,会返回原值 } void ModifyPointerone(char *str){ strcpy(str,"World"); //新的字符串内容复制到已存在的字符数组中 } void ModifyPointertwo(char *str){ str[0]='P'; //改变字符串中起始位置的值,其余不变 } void ModifyPointerthree(char *str){ str[2]='P'; //改变字符串中起始位置的值,其余不变 } void ModifyReference(char &str) { str = 'B'; // 修改引用的值,让它引用到另一个字符 } void ModifyReferenceone(char &str) { strcpy(str,"world"); // 报错,只能修改一个字符 } int main() { char greeting[] = "Hello"; char *ptr = greeting; cout << ptr << endl; // 输出:Hello ModifyPointer(ptr); cout << *ptr << endl; //输出:H,指针指向字符的起始位置 ModifyPointer(ptr); cout << ptr << endl; // 输出:Hello,指针的值未改变 ModifyPointerone(ptr); cout <<ptr <<endl; //输出:World,指针指向改变 ModifyPointertwo(ptr); cout <<ptr <<endl; //输出: Porld,指针的起始位置改变 ModifyPointerthree(ptr); cout <<ptr <<endl; //输出:PoPld,指针的三个值改变 char &ref = greeting[0]; cout << ref << endl; // 输出:P ModifyReference(ref); cout << ref << endl; // 输出:B,引用的值被修改 ModifyReferenceone(ref); cout << ref << endl; return 0; }
其中最重要的三点
•*str可以对字符或字符串进行改变 void ModifyPointerone(char *str){ strcpy(str,"World"); //新的字符串内容复制到已存在的字符数组中 } void ModifyPointertwo(char *str){ str[0]='P'; //改变字符串中起始位置的值,其余不变 }
•&str只能使一个字符改变
char &ref = greeting[0]; cout << ref << endl; // 输出:P void ModifyReference(char &str) { str = 'B'; // 修改引用的值,让它引用到另一个字符 } ModifyReference(ref); cout << ref << endl; // 输出:B,引用的值被修改
•函数的参数调用和主函数中的引用
char *str = "Hello"; cout << str << endl; // 输出:Hello str ="World"; //指针变量本身地址没有改变,只是改变了指针指向的常量字符串地址 cout<< str <<endl; //输出:World void ModifyPointer(char *str) { str = "World"; // 参数str是指向字符串的起始位置,而不是字符串本身,所以这样写是错误的,会返回原值 }
补充:char *&str,char **str与char *str的区别
char *str:存储char类型对象的地址
char **str:是一个指向指针的指针,用于表示一个指针数组
可以看作char* *str:str是一个指针,指向的类型是char*
char *&str:声明了一个指向指针的引用,可以修改指针本身所指向的地址。
示例代码
#include <iostream> using namespace std; void ModifyStringArray(char** str) { // 修改字符串数组中的第一个元素 str[0] = "Modified"; } void ModifyStringPointer(char*& str) { // 修改指向字符串的指针 str = "Modified"; } int main() { char* strArray[] = { "One", "Two", "Three" }; char** ptrToStrArray = strArray; ModifyStringArray(ptrToStrArray); cout << strArray[0] << endl; // 输出 "Modified" char* strPtr = strArray[1]; ModifyStringPointer(strPtr); cout << strArray[1] << endl; // 输出 "Modified" return 0; }
由上可以看出char ** 和char *&可以完成同样的效果,但是写法是不同的
3.char str是一个单个字符的变量,储存一个字符的值,例如
char str = 'C'; cout << str << endl; // 输出:C str = 'D'; cout << str << endl; // 输出:D
💖💖如有错误请大佬们多多指教,谢谢大佬们!!💖💖