【C++ 学习】字符串(指针形式和数组形式)

字符串

字符串基本知识

字符串是以空字符(\0)结尾的char类型数组。如下程序,给出了字符串的声明定义方式。

void test(void) {
	char words[MAXLENGTH] = "I am a string in an array.";
	const char* pt1 = "something is pointing me.";
	puts("Here are some strings.");
	puts(MSG);
	puts(words);
	puts(pt1);
	words[8] = 'p';
	puts(words);
}

字符串定义都是使用双引号来进行定义的,单引号定义的是字符,双引号中的字符和编译器自动加入末尾的\0字符。
字符串常量属于静态存储类别,这说明,如果在函数中使用字符串常量,该字符串只会存储一次。

字符串数组形式和指针形式

字符串存储在静态存储区,程序载入内存时,也载入了程序中的字符串,但是,程序在开始运行时,才会为其分配内存。此时,才会将字符串拷贝到数组中。此时字符串有两个副本,一个时静态内存区中的字符串字面量,另一个是存储在数组中的字符串。而指针形式,则会将字符串在静态区的地址拷贝给指针。
在静态存储区的字符串字面量被视为const数据。

void test1(void) {
	char ar[] = MSG;
	const char* pr = MSG;
	printf("address of \"I am a symbolic string constant.\": %p \n", "I am a symbolic string constant.");
	printf("address of ar: %p \n", ar);
	printf("address of pr: %p \n", pr);
	printf("address of MSG: %p \n", MSG);
}

输出:

address of "I am a symbolic string constant.": 00007FF77A209C88
address of ar: 000000FD6DD0F9E8
address of pr: 00007FF77A209C88
address of MSG: 00007FF77A209C88

可以使用指针形式来指向字符串进行使用,但是不要对指针形式字符串进行更改,这可能会引起错误(具体取决于编译器)。

void test2(void) {
	const char* pr = MSG;
	while (pr) {
		printf("%c", *pr);
		pr++;
	}
	printf("\nDone!");
}

可以使用字符串指针形式,在指针方式下,指针可以进行移动,但是,需要把循环条件写好,该方式下的循环条件并是一个合适方式,原因在于指针会一直移动下去(应该也是取决于编译器?)。

void test2(void) {
	const char* pr = MSG;
	while (*pr != '\0') {
		printf("%c", *pr);
		pr++;
	}
	printf("\nDone!");
}

该形式更好。

你可能感兴趣的:(C++学习,c++,学习)