1、字符串指针
char str1[] = "abc"; char str2[] = "abc"; cout<<(str1 == str2)<<endl;//输出0 const char str3[] = "abc"; const char str4[] = "abc"; cout<<(str3 == str4)<<endl;//输出0 const char *str5 = "abc"; const char *str6 = "abc"; cout<<(str5 == str6)<<endl;//输出1 char *str7 = "abc"; char *str8 = "abc"; cout<<(str7 == str8)<<endl;//输出1 char A='a'; //A在栈中 char *p ="a"; //p是栈中一个地址,同上
点评:
>>str1、str2、str3、str4是数组变量,各自有自己的内存空间,数组会在栈中直接存字母所以它们的地址会不同。
>>str5,str6,str7,str8是指针,它们指向相同的常量区域,上面的是局部中栈中存放,str5代表串的地址,而串在全局区存放。
>>如果是一个字符,则char *p='a'是错误的,'a'只能表示char类型。
2、const常量指针
char * const p;//p值不可更改
char const *p;//*p值不可更改
const char *p;//*p值不可更改
点评:
>>看const修饰的是谁,修饰的后面的东西,都是不可更改的。
3、字符串的大小
char ss[10]="hello1234"; char qq[]="hello1234"; //编译器会分配10个字节来存,而不是9,sizeof = 9+1 char dd[100]=""; //这个数组里面全部初始化为0 cout<<sizeof(ss)<<endl;//输出10 cout<<sizeof(dd)<<endl;//输出100
【点评】第10个字节为'\0',如果字符数大于9,则编译出错,
对于sizeof(qq[ ])的字符串,注意是编译器分配的内存大小,但是对于函数形参而言,如下
void Func(char str[100]) { sizeof(str); //输出4,编译器按照指针来编译,相当于sizeof(char* pStr) }
4、sizeof和strlen的区别和联系
//代码分析 char arr[10] = "Hello"; int len_one = strlen(arr); //输出:5,数组的 int len_two = sizeof(arr); //输出:10,数组空间的大小
strlen(arr),只是返回字符串的个数,遍历字符串的地址,然后计数,不包括'\0'。
sizeof(arr),定义的数组的内存单元大小。
但是在字符串内存释放的时候,要strlen()+1。
参考:1、Sizeof与Strlen的区别和联系