1.字符指针
https://blog.csdn.net/qq_43668570/article/details/98980446
指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。
即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。
如下:
char* p1="abc"; char* p2="abc"; cout<<(p1==p2)<<endl;//1 cout<<p1<<" "<<p2<<" "<<endl;//abc abc cout<<*p1<<" "<<*p2<<" "<<endl;//a a
cout<<&p1<<" "<<&p2<<endl;//0x62fe18 0x62fe10
对指针取内容,是首个字符;对指针取地址,获取到了指针的地址。
一般来说,不是要取内容*才能获取到内容吗?这里直接输出p1和p2就可以获取到内容了?
对int型数字来说:
int* p1=new int(5); int* p2=new int(5); cout<<(p1==p2)<<endl;//0 cout<<p1<<" "<<p2;//0x2522560 0x2522580
cout<<&p1<<" "<<&p2<<endl;//0x62fe18 0x62fe10
cout<<*p1<<" "<<*p2<<endl;//5 5
直接输出p1和p2是输出的地址,它们所指向的堆内存的地址,只有用了取内容符号之后才会输出所指内存的内容。
char str[10] = "Hello"; char *ptr = str;//数组名代表数组的首地址 //等价于 char *ptr; ptr = str;//等价于ptr = &str[0];将数组的首地址赋给字符指针ptr
2.是否添加\0?
https://blog.csdn.net/wuwuku123/article/details/103608918
这种方法定义时,系统会自动在字符串的末尾加上字符串结束符,即 ‘\0’,:
char str[]="12345";//sizeof(str)为 char str[]={"12345"};//6 char str[6]="12345";//6
这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为\0,如上面的数组str中的元素实际上是:‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘\0‘,‘\0‘,‘\0‘,‘\0‘,‘\0‘
char str[10]={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘};
系统不会自动在字符串的末尾加上字符串结束符;
此时用sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。
char str[]={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘};
所以,采用该方法定义时,一般人为地加上\0,即char str[]={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘, ‘\0‘};
char str[]={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘, ‘\0‘}; char str[6]={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘}; //故意给数组预留一个空位 char str[]={“12345”};//第一行手动添加\0后和当前效果相同