本文拟解答以下问题:
a. 字符串做函数参数传递的是什么?
b. 如何利用new和指针来存储键盘输入的字符串呢?
4.8.3 指针与字符串
- 指针与字符串
字符串可以用数组来存储,称为C风格字符串/字符串数组,所以数组与指针的关系可以平移到字符串中来。
char flower[10] = “rose”;
cout<<flower<<“s are red\n”//数组名flower表示数组第一个元素的地址,直观感觉应该是要打印一个地址似乎才对(不过好像也不对,因为毕竟flower是常量。)该怎么处理呢?答:C++中规定cout对象把字符串第一个字符的地址当成是整个字符串的地址,因此它打印完该地址处的字符继续向后打印,直到遇到空字符为止。简言之,传递给cout的是字符串的地址,打印的是整个字符串。这样设计显然要比传递整个字符串要更有效率。
所以:注意:在cout和多数C++表达式中,char数组名/char指针以及字符串常量都被解释为字符串第一个字符的地址。
那么问题来了,用cout如何打印字符串的地址呢?
答:一般来说,给cout提供一个指针,将打印地址 。但对于char类型的指针打印的是整个字符串,所以C++编译器设计为cout<<(int)ps;将char强制转换为int。
如何利用new和指针来存储键盘输入的字符串呢?避免用固定大容量的数组,节省空间
答:看下面这个函数。
// 从键盘中输入字符串,分配刚刚好的内存,返回首字符的地址。
char * getname()
{
char temp[80];
cout << “Enter last name:”;
cin>>temp;
char*pn = new char[strlen(temp)+1];
strcpy(pn, temp);
return pn;
}
考虑如何获得下面字符串数组animal的副本?
char animal[20] = “bear”;//声明一个临时存放字符串的大容量数组
ps = new char[strlen(animal) + 1];// get new storage
??ps = animal;//不可行,效果是将animal数组的首地址赋值给了ps。
应该用下面的strcpy(ps, animal);// 实现了将animal地址处的字符串赋给了ps地址处的那块内存。
4.8.4 使用new 创建动态结构
2. 使用new创建动态结构
//由于结构和类十分相似,因此本节介绍的有关结构的技术也适用于类。
2.1 功能
与之前的动态数组相似,动态结构指的是在运行时才为结构分配所需的空间。
2.2 创建
inflatable * ps = new inflatable;//句法和C++的内置类型雷同
2.3使用(访问)
struct inflatable //结构体定义
{
char name[20];//注意是分号,不是逗号,初始化的时候是,
float volume;
double price;
};
inflatable * ps = new inflatable;
//访问成员
ps->volume//方式一
(*ps).volume//方式二,*ps相当于结构体的名字。