当前位置: 首页 > news >正文

使用new创建动态结构

在运行时创建数组优于在编译时创建数组,对于结构(同一个结构可以存储多种类型的数据。)也是如此。需要在程序运行时为结构分配所需的空间,这也可以使用new运算符来完成。通过使用new,可以创建动态结构。同样,“动态”意味着内存是在运行时,而不是编译时分配的。由于类与结构非常相似,因此有关结构的技术也适用于类。

将new用于结构分为两步:创建结构和访问其成员。

例如,要创建一个未命名的inflatable类型,并将其地址赋给一个指针,可以这样做:

inflatable *ps = new inflatable;

这将把足以存储inflatable结构的一块可用内存的地址赋给ps。

关于访问成员。创建动态结构时,不能将成员运算符句点用于结构名,因为这种结构没有名称,只是知道它的地址。C++专门为这种情况提供了一个运算符:箭头成员运算符(->),该运算符由连字符和大于号组成,可用于指向结构的指针。例如,如果ps指向一个inflatable结构,则ps->price是被指向的结构的price成员。

如果结构标识符是结构名,则使用句点运算符;如果标识符是指向结构的指针,则使用箭头运算符。

另一种访问结构成员的方法,如果ps是指向结构的指针,则*ps就是被指向的值——结构本身。由于*ps是一个结构,因此(*ps).price是该结构的price成员

//4.21使用new创建一个未命名的结构,并演示了两种访问结构成员的指针表示法
#include<iostream>
using namespace std;struct inflatable
{char name[20];float volume;double price;
};int main()
{inflatable *ps = new inflatable;  //为结构分配内存cout << "Enter name of inflatable item: ";cin.get(ps->name, 20);cout << "Enter volume in cubic feet: ";cin >> (*ps).volume;cout << "Enter price: $";cin >> ps->price;cout << "Name: " << (*ps).name << endl;cout << "Volume: " << ps->volume << " cubic feet\n";cout << "Price: $" << ps->price << endl;delete ps;system("pause");return 0;
}

下面介绍一个使用new和delete来存储通过键盘输入的字符串的示例。程序清单4.22定义了一个函数getname(),该函数返回一个指向输入字符串的指针。该函数将输入读入到一个大型的临时数组中,然后使用new[]创建一个刚好能够存储该输入字符串的内存块,并返回一个指向该内存块的指针。对于读取大量字符串的程序,这种方法可以节省大量内存。

假设程序要读取100个字符串,其中最大的字符串包含79个字符,而大多数字符串都短得多。如果用char数组来存储这些字符串,则需要1000个数组,其中每个数组的长度为80个字符。这总共需要80000个字节,而其中的很多内存没有被使用。另一种方法是,它包含1000个指向char的指针,然后使用new根据每个字符串的需要分配相应数量的内存。是根据输入来分配内存,而不是为每个字符串使用一个大型数组。

//4.22定义了一个函数getname(),该函数返回一个指向输入字符串的指针。
//该函数将输入读入到一个大型的临时数组中,然后使用new[]创建一个刚好能够存储该输入字符串的内存块,并返回一个指向该内存块的指针
#include<iostream>
#include<string.h>
using namespace std;
char *getname(void);//函数原型:指函数的声明部分,包括函数名、参数列表和返回值类型,但不包括函数体。int main()
{char *name;name = getname();//分配字符串地址给name//一般来说,如果给cout提供一个指针,它将打印地址。但如果指针的类型为char*,则cout将显示指向的字符串,如上一行代码。//如果要显示字符串的地址,则必须将这种指针强制转换为另一种指针类型,如int*。如下面的代码。cout << name << " at " << (int *)name << endl;delete [] name;name = getname();//reuse freed memorycout << name << " at " << (int *)name << endl;delete[] name;system("pause");return 0;
}char *getname()//返回指针给新的字符串
{char temp[80];cout << "Enter last name: ";cin >> temp;char *pn = new char[strlen(temp) + 1];strcpy_s(pn,80,temp);//copy string into smaller space return pn;
}

http://www.lryc.cn/news/196467.html

相关文章:

  • 论文笔记与复现[156]PARAFAC. tutorial and applications
  • Python 基础30道测试题
  • 【环境搭建】linux docker-compose安装rocketmq
  • python:使用卷积神经网络(CNN)进行回归预测
  • 数据结构----算法--五大基本算法
  • 网格大师如何把b3dm转为osgb格式?
  • 基于深度优先搜索的图遍历
  • Web3D虚拟人制作简明指南
  • 【大数据 - Doris 实践】数据表的基本使用(一):基本概念、创建表
  • 剑指Offer || 038.每日温度
  • URL because the SSL module is not available
  • excel 日期与时间戳的相互转换
  • MongoDB中的嵌套List操作
  • 【C#】什么是并发,C#常规解决高并发的基本方法
  • MySQL双主一从高可用
  • #力扣:2894. 分类求和并作差@FDDLC
  • 【网络协议】聊聊从物理层到MAC层 ARP 交换机
  • WordPress插件 WP-PostViews 汉化语言包
  • 基础课2——自然语言处理
  • 有趣的GPT指令
  • 小样本学习--(1)概论
  • 数据结构之手撕顺序表(讲解➕源代码)
  • 小微企业是怎样从客户管理系统中获益的?
  • mysql整库备份表结构和数据
  • LinkedHashMap与LRU缓存
  • 2023大联盟6比赛总结
  • 05_51单片机led流水线的实现
  • Java系列 | 如何讲自己的JAR包上传至阿里云maven私有仓库【云效制品仓库】
  • 小程序技术加速信创操作系统国产化替换
  • 免费:实时 AI 编程助手 Amazon CodeWhisperer