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
💖💖如有错误请大佬们多多指教,谢谢大佬们!!💖💖