前言:写这篇文章是为了让大家真正的搞懂字符数组。大家都知道一个数组的数组名,就是该数组的那块内存空间的首地址。那么为什么其他数组打印首地址,就是真真切切的将地址打印出来了,而字符数据却是输出了整个字符数组的内容?
一、真正的了解字符数组
通过这段代码来讲解:
char a[11] = "0123456789"; // 定义字符数组
char *ptr = a;
cout << (void *)a << endl; // 打印首地址
cout << a << endl; // 打印字符数组内容
cout << ptr << endl; // 打印字符数组内容
cout << (void*)ptr << endl; // 打印字符数组首地址
cout << *ptr << endl; // 通过指针访问字符数组元素
首先a是一个长度为20的字符数组的数组名,即字符数组的首地址。那么a是什么类型呢,在我看来a可以理解为是一个数据类型为char * 的指针变量,这个变量存放的就是系统给字符数组分配的那块内存空间的首地址,这个是很关键的。同时,我们确实可以用一个char * 的指针变量 ptr去接收a.
那么当打印字符数组的数组名时,打印的是字符数组的内容,而不是字符数组对应的这块内存空间的首地址,为什么呢?。
因为字符数组都以’\0’结束,所以在输出的时候,程序知道在什么时候结束,所以c++底层,对字符数组的输出cout重载了,输出的是字符数组的内容,而不是地址。
而要想获得地址输出的时候可以强制转换为其他类型的指针,在c++中 void 可以表示任意类型的指针变量。*
加粗样式
结果:
二、非字符数组
当数组为非字符数组时,打印数组名,就是地址。注意与字符数组区分,搞懂原理即可。