1002—动态数组的推广之指针与字符串

本文拟解答以下问题:
a. 字符串做函数参数传递的是什么?
b. 如何利用new和指针来存储键盘输入的字符串呢?
4.8.3 指针与字符串

  1. 指针与字符串
    字符串可以用数组来存储,称为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相当于结构体的名字。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值