字符串数组
const char*
字符串只能赋值给const char*变量,不能赋给char *变量。
const char* a = "abcde";
程序自动在字符串数组的末尾加’\0’。对于上述程序,a[5]是’\0’,输出为空,a[5]之后的也可以索引到,输出的话也是单个字符,但是就不确定是什么字符了。
可以使用strlen()来求字符串长度。长度是不包含末尾’\0’的。
cout << strlen(a) << endl;
字符串数组可直接用cout输出
cout << a << endl;
也可也用printf输出
printf("%s", a);
printf(a);//以上两种printf都行
const char[]
定义时必须初始化。必须用字符串来初始化。只有在初始化时能用字符串来赋值,其余时候不能赋值。
const char b[] = "abc";
b = "def";//错
若初始化时不指定长度,则数组长度默认为字符串长度+1,即包含末尾’\0’的长度。若指定长度,数组长度就是指定的长度,且必须大于被赋值字符串长度+1。
用字符串初始化后,剩余位数全部被初始化为’\0’。
变量类型是const char [数组长度]。可用typeid(数组名).name()得到。
可以使用strlen求字符串长度。注意,这是字符串长度,不是数组长度。字符串长度是到第一个’\0’的长度,且不包含’\0’。
可以用cout或printf直接输出
cout << b << endl;
printf("%s\n", b);
printf(b);
字符数组
char[]
定义时可以不初始化。可以用字符串来初始化。只有在初始化时能用字符串来赋值,其余时候不能这么赋值。
char b[] = "abc";
b = "def";//错
若初始化时不指定长度,则数组长度默认为字符串长度+1,即包含末尾’\0’的长度。若指定长度,数组长度就是指定的长度,且必须大于被赋值字符串长度+1。
用字符串初始化后,剩余位数全部被初始化为’\0’。
也可以初始化为空数组,此时需指定数组长度。
char array[20] = { NULL };
变量类型是char [数组长度]。可用typeid(数组名).name()得到。
可以使用strlen求字符串长度。注意,这是字符串长度,不是数组长度。字符串长度是到第一个’\0’的长度,且不包含’\0’。
可以用cout或printf直接输出
cout << b << endl;
printf("%s\n", b);
printf(b);
如果把数组内所有的’\0’都删了,也可以cout或printf,但是会输出烫。
char*
可以将char[]的变量(也是指针)赋给char*变量。
char b[] = "abc";
char* a = b;
不能将字符串直接赋给char*。
char* a = "abc";//错
char* a需要初始化,否则不知道指向哪里,很危险。
char* a;//此处写法是错误的,不能这样初始化,
//初始化时需要指向某个地址,否则指针所指地址是不明确的,容易出问题。
a[0] = 'a';//可以依次对数组元素赋值。
a[1] = 'b';
如果char *a没有被初始化,也没有被赋值,则a是一个未被定义的变量,不能使用strlen,不能用cout或printf直接输出。
如果char* 被初始化或赋值为一个char[]变量,则可以使用strlen,结果是数组到第一个’\0’的长度,不包括’\0’。也可以使用cout和printf直接输出。
cout << strlen(a) << endl;
cout << a << endl;
printf("%s\n", a);
此时char的typeid是char。
指针地址问题
char[]指向内存中存储字符串的地址,此时常量存储区也存储了字符串。
const char[]指向内存中存储字符串的地址,此时常量存储区也存储了字符串。
const char*指向常量存储区的地址,不会在内存中存储字符串。
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout << (str1 == str2) << endl;
cout << (str3 == str4) << endl;
cout << (str5 == str6) << endl;
结果是