欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

字符数组、字符串指针

程序员文章站 2022-07-14 23:30:33
...
#include <iostream>
using namespace std;

int main() {
	char a[] = "abcdef";
	const char* b = "abcdef";	// C++11 不允许 char* p = "abc"; 了,必须有 const
	char c[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	const char* d = "abcdef";

	cout << "a: " << a << endl;
	cout << "b: " << b << endl;
	cout << "c: " << c << endl;
	cout << "d: " << d << endl;
	printf("%d %d %d\n", sizeof(a), sizeof(b), sizeof(c));
	printf("&a = %p, &b = %p, &c = %p, &d = %p\n", &a, &b, &c, &d);
	printf("&*b = %p, &*d = %p\n", &*b, &*d);
	printf("&*a = %p, &*c = %p\n", &*a, &*c);
}

  输出如下:

a: abcdef
b: abcdef
c: abcdef烫烫烫烫烫@?
d: abcdef
7 4 6
&a = 0019F760, &b = 0019F754, &c = 0019F744, &d = 0019F738
&*b = 00E78B40, &*d = 00E78B40
&*a = 007FFBB8, &*c = 007FFB9C

  想记录的有以下几点:

  1. C++11 开始,不允许 char* p = "abc"; 这样的代码了,C++11之前是允许的。但是这样其实是错误的,因为指向了字符串常量区的字符串,本身就修改它的字符串内容就是错的(以前可以 char* p = "abc";,也可以 *p = 'a',编译不会出错,但是运行会有问题),所以C++11开始,必须用 const 修饰才能 const char* b = "abc"; 了。
  2. const char* b = "abcdef"; 不管后边的字符串多长,sizeof(b) 在32位下都是 4,因为指针大小就是 4;
  3. C++ 中字符串最后默认会添加 ‘\0’,也就是 “blabla”,其实是 7 个字符;上边代码中的 c 因为是用一个一个字符初始化,所以 sizeof(c) 是 6,就像是 int 数组一样,而 sizeof(a) 就是 7,因为多了个 ‘\0’ 字符;
  4. 在输出的字符串的时候,C++ 会挨个字符输出,直到遇到 ‘\0’ 为止,这也就是为什么上边那一条,字符串结尾会默认添加 ‘\0’。所以 c 输出的时候,会输出些奇怪的东西,直到遇到一个不知道在哪里的 ‘\0’’ 为止;
  5. const char* b = "abcdef"; 这样指向字符串常量区的字符串的指针,地址不一样(d 和 b),但是指向的字符串的地址,是相同的(&*b 和 &*d 相同,说明第一个字符 ‘a’ 的地址是一样的,也就是字符串地址是一样的),因为都是常量区的那个 “abcdef”;使用字符数组的形式,“abcdef” 就不是一样的(&*a 和 &*c)。