字符串数组或string

字符串数组

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;

结果是
在这里插入图片描述

发布了52 篇原创文章 · 获赞 0 · 访问量 681

猜你喜欢

转载自blog.csdn.net/UniversityGrass/article/details/104681744