1、字符串型数据的定义
在c++中除了包含string.h的头文件后用:string str="数据"。的形式外另外一种方式就是标题中的 char str[ ]="数据"来定义字符串变量。
2、字符串型的数据是如何储存的内存空间中的。
通过一个例子来说明,首先定义一个字符串变量:
char str[ ]="1234567890";
通过给str[ ]添加下角标可以访问字符串变量中的每一个元素,但是这对我们找到字符串型数据是如何存储在内存中并没有帮助。于是骚操作来了,思路如下。
->获取字符型变量第一个元素的地址:int*p=(int*)&str[0] ;
->然后输出*p: cout<<*p ;此时如果str[ ]的初值如上述定义那么将会得到一个诡异的输出结果下:
看到这我们发现这个操作是可以通过编译但输出结果是不明确的。
->将输出结果转换成二进制:00110100 00110011 00110010 00110001
到此就可以看出一些端倪了,这似乎是四个递减的数,而且他们的等差恰好为一。没错就是ASCII码,上面的四个字节二进制数据恰好对应了,1,2,3,4这四个数字的ASCII码52,,51,50,49。
->代码验证:
#include <iostream>
using namespace std;
int main()
{
char str[ ]="1234567890";
int a = 100;
int*p = &a;
p = (int*)&str;
int gaota[4];
int temp;
int mod = 256;
temp= *p;
cout << "*p:\t"<<*p << endl;
//将四个字节的二进制数转化为四个十进制数;
for (int i = 0; i < 4; i++)
{
gaota[i] = temp % mod;
temp = (temp - gaota[i]) / mod;
cout << gaota[i] << endl;
}
system("pause");
return 0;
}
运行结果如下:四行输出的均是ASCII码,将cout<< gaota[i]<<endl;加上一个强制转换的函数(cout<< (char)gaota[i]<<endl;)即可输出1,2,3,4。
3、结论:
字符串变量中的每个元素都是以对应的ASCII码值储存在一个字节大小的内存空间中的(注意汉字除外!)。