(五十八)结构与指针

在使用new来创建动态结构时,表示创建的新结构中的某个变量,和普通结构中某个变量的形式不同。例如:

#include<iostream>
#include<string>
using namespace std;

struct ab	//定义一个结构ab
{
	string a;	//名字
	int b;	//重量或数量
	double c;	//单价
};

int main()
{
	ab *shuiguo = new ab;	//声明结构水果(shuiguo),使用结构ab形式,通过new的形式创建动态结构
	cout << "输入水果的名称:" << endl;
	getline(cin, shuiguo->a);	//因为是string类型,所以需要使用getline(cin,结构中的变量名)这种形式,对于非动态结构,shuiguo->a就类似shuiguo.a
	cout << "输入水果的重量(斤):" << endl;
	cin >> (*shuiguo).b;	//(*shuiguo).b和shuiguo->b是等价的
	cout << "输入水果的单价(元/斤):" << endl;
	cin >> shuiguo->c;	//指针名->结构变量名 和 结构名.结构变量名 是等价的
	cout << "输入结束。\n经过计算:" << shuiguo->a << "的重量为" << shuiguo->b << "斤,单价为" << shuiguo->c << "元/斤。" << endl;
	//使用箭头运算符来表示动态结构中的某个变量
	cout << (*shuiguo).a << "的总价值为" << shuiguo->b*(*shuiguo).c << "元" << endl;
	//带箭头运算符表示的结构中某个变量,可以直接用于表达式
	cout << shuiguo << endl;
    delete shuiguo;
	cout << endl;
	ab bi;	//声明结构笔(bi),使用ab结构的形式
	bi.a = "铅笔";	//结构bi的名称为 铅笔
	bi.b = 15;	//数量为15
	bi.c = 0.5;	//单价为0.5元/根
	cout << bi.a << "的单价为" << bi.c << "元/根,我们要买" << bi.b << "根" << bi.a << "。\n";
	cout << "经过计算,需要花费" << bi.b*bi.c << "元。" << endl;

	system("pause");
	return 0;

输出:

输入水果的名称:
苹果
输入水果的重量(斤):
25
输入水果的单价(元/斤):
3.33
输入结束。
经过计算:苹果的重量为25斤,单价为3.33元/斤。
苹果的总价值为83.25元
005B09F8

铅笔的单价为0.5元/根,我们要买15根铅笔。
经过计算,需要花费7.5元。
请按任意键继续. . .

①在使用定义的ab结构时,创建一个结构。

假如使用的是普通结构。即:“定义结构名 结构名”如ab bi; 那么表达bi这个结构中某个变量的办法是bi.变量名。

 

假如使用new来创建动态结构,创建方法为“定义结构名 *指针=new 定义结构名”即ab*shuiguo = new ab; 

在表达结构中的变量时,有两种表达形式:(*指针名).结构变量名 或者 指针名->结构变量名 。即(*shuiguo).a或者shuiguo->a 。前者是类似普通结构,指针加解除运算符(*)相当于 结构名 来理解。对比而言,二者形式相近:

(*bi).a  和  shuiguo.a

 

②无论是(*shuiguo).a或者是shuiguo->a,都可以直接运用在表达式之中,和我们使用普通结构没什么区别。

 

③由于shuiguo是指针,所以cout<<shuiguo<<endl;输出的是指针指向的内存地址。

 

④因为是使用new创建动态结构,因此对应的可以使用delete来删除动态结构。具体格式为:delete 指针名。如:delete shuiguo;

 

 

 

使用new创建字符串来节约内存:

之前使用new来创建动态结构,其实new和delete也可以在不同的函数中使用,例如一个函数分配内存,一个函数释放内存。特别是在涉及循环的时候,可以节约不少内存。如代码:

#include<iostream>

char *getname(void);	//这是一个函数原型,在开始进行声明,之后才能调用。
//char*类型表示返回的是字符串,void表示无需输入
using namespace std;

int main()
{
	char*a;
	a = getname();	//给指针a赋值,值为函数getname()的返回值。注意,指针a和指针c指向的内存地址是相同的
	cout << "在主函数里,把指针c的地址赋给指针a,指针a的值为" << a << endl;	//输出指针a所指向地址的值
	cout << "指针a的地址为" << (int*)a << endl;	//输出指针a所指向的地址
	delete []a;	//删除指针a
	cout << endl;

	a = getname();	//给指针a赋值,值为函数getname()的返回值
	cout << "在主函数里,把指针c的地址赋给指针a,指针a的值为" << a << endl;	//输出指针a所指向地址的值
	cout << "指针a的地址为" << (int*)a << endl;	//输出指针a所指向的地址
	delete[]a;	//删除指针a
	system("pause");
	return 0;
}

char*getname()
{
	char*b = new char[20];	//为指针b创建新地址
	cout << "随便输点什么,别超过20个字符" << endl;
	cin.get(b, 20).get();	//将输入的内容赋值给指针b所指向地址里,并用.get()舍弃换行符
	cout << "你输入的是: " << b << endl;	//输出指针b所指向地址的值
	cout << "你输入的位置所在的内存地址为:" << (int*)b << endl;	//输出指针b所指向地址
	char*c = new char[strlen(b) + 1];	//初始化指针c,并位置new一个新的内存地址
	strcpy_s(c, strlen(b) + 1, b);	//将指针b的值赋值到指针c指向地址的
	cout << "将你输入的字符串复制到指针c的位置。" << endl;
	cout << "指针c的地址为:" << (int*)c << endl;	//显示指针c所指向的地址
	cout << "指针c所指向地址的值为" << c << endl;	//显示指针c所指向地址的值

	return c;
}

输出:

随便输点什么,别超过20个字符
abc
你输入的是: abc
你输入的位置所在的内存地址为:004309F8
将你输入的字符串复制到指针c的位置。
指针c的地址为:00430658
指针c所指向地址的值为abc
在主函数里,把指针c的地址赋给指针a,指针a的值为abc
指针a的地址为00430658

随便输点什么,别超过20个字符
def
你输入的是: def
你输入的位置所在的内存地址为:00430658
将你输入的字符串复制到指针c的位置。
指针c的地址为:00430698
指针c所指向地址的值为def
在主函数里,把指针c的地址赋给指针a,指针a的值为def
指针a的地址为00430698
请按任意键继续. . .

①char*c = new char[strlen(b) + 1];这行代码,可能为指针c两次new到相同的内存地址,也可能new到不同的内存地址。

 

②因为指针a指向的地址为指针c所指向的地址,所以指针a指向的地址和指针c指向的地址是相同的;

而指针c相对于指针b来说,是new了一个新地址,因此和指针b的地址是不同的;

指针b每次都new了一个新地址,所以也可能是不同地址(但由于之前delete指针a),因此也可能是不同的;

 

③根据实际测试,delete []a;和 delete a; 都能顺利运行,但按之前来说,删除字符串指针应该是delete []a; 才对。

 

④在删除指针的情况下,下一次new,是有可能new到相同的内存地址的。

 

⑤在函数getname()之中,执行完函数之后,指针b和指针c因为是自动存储,因此之后无法再次访问指针b和c,但因为没有被delete,所以其占用的内存地址还在。但是指针c和指针a指向的内存地址相同,delete了指针a,实际上也释放了指针c所指向的内存地址,但是没有释放指针b所指向的内存地址。参照(五十九自动存储),因此,指针b可能造成内存泄露

时间: 2024-09-09 15:58:56

(五十八)结构与指针的相关文章

五十八、NT Server用作Internet的网关_网络冲浪

五十八.NT Server用作Internet的网关  --- [该文章的方法不一定可行,请读者自己实践后再做结论]  --- 假如你是一个网络管理员,你所负责的是一小型企业的 NT网络环境,在"上网"已成潮流的今天,你可能会遇到把你的 Intranet连上 Internet这个问题.本文将对如何建立本地通信与 Internet路由提供一个解决方案.  --- 运行 NT Server 4.0的计算机不仅能用作 LAN/LAN的路由器,还能充当 Internet的网关.现在你唯一需要的

GOLIVE5.0教程(五十八)

教程 5.3创建动画 在GoLive 5中应用浮动框(Floating Boxes)即可创建动画.浮动框与DreamWeaver 3/4中的图层非常相似,也是基于HTML DIV元素而存在的,由于HTML 3.2与HTML 4.0增强了DIV元素的功能,因而使得GoLive 5能很好的应用它,并允许放置和堆栈接受背景图像或者背景颜色.又由于DIV是DHTML (Dynamic(动态) HTML)的核心元素,以及放置CSS的Major Building Blocks(主营造块),所以使用浮动框能在

Ruby on rails开发从头来(五十八)- ActiveRecord基础(自关联)

或许存在这样的情况,在一个表中,一条记录关联到表中的另一条记录,例如,公司中的每个雇员都有上级和下级,而他们同时又是雇员,在Rails中你可以这样使用Employee类: class Employee < ActiveRecord::Base belongs_to :manager, :class_name => "Employee", :foreign_key => "manager_id" belongs_to :mentor, :class_

关于c语言结构体指针数组的问题

问题描述 关于c语言结构体指针数组的问题 我有一个数组,里面每个成员都是结构体指针,我应该怎么给这个数组分配空间? 解决方案 指针变量的长度都是固定的,与你指向什么东西没关系的. 解决方案二: #include #define N 3 struct student { long int num; char name[20]; float score[3]; float aver; }; int main() { void Input(struct student stu[]); struct s

Emacs之魂(五):变量的“指针”语义

Emacs之魂(一):开篇Emacs之魂(二):一分钟学会人界用法Emacs之魂(三):列表,引用和求值策略Emacs之魂(四):标识符,符号和变量Emacs之魂(五):变量的"指针"语义Emacs之魂(六):宏与元编程Emacs之魂(七):变量捕获与卫生宏Emacs之魂(八):反引用与嵌套反引用Emacs之魂(九):读取器宏 1. 语义学 在计算理论中,形式语义学是关注计算模式和程序设计语言含义的严格的数学研究领域. 语言的形式语义是用数学模型去表达该语言描述的可能计算来给出的. 提

058_《突破Delphi7.0编程实例五十讲》

<突破Delphi7.0编程实例五十讲> Delphi 教程 系列书籍 (058) <突破Delphi7.0编程实例五十讲> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 作者: 张增强 丛书名: 万水编程实例五十讲丛书 出版社:中国水利水电出版社 ISBN:7508412761 上架时间:2002-12-21 出版日期:2002 年12月 开本:16开 页码:362 版次:1-1 内容简介 Delphi是面向对象的可视化编程语言,它是目前面向对

春雨医生张锐:十八岁出门远行

春雨医生张锐:十八岁出门远行(TechWeb配图)在移动游戏与移动社交吸引绝大多数人目光的时候,躲在第二三阵营的垂直应用开始悄然生长.与微信.微博等聚集数亿人群的平台相比,来到垂直应用的用户需求更加精确化,他们的行为所投射的,往往是现实生活中的大问题.2011年,张锐从网易副总编的岗位上离开,赶上了移动互联网的首波创业风潮.张锐将自己的创业选择形容为余华的小说<十八岁出门远行>,期间也一度受到网易CEO丁磊的"耳提面命".几个月后,张锐作为CEO组建起了春雨的骨干团队,CT

猪八戒网答草根五十五问

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 大家好,我是猪八戒网的朱明跃,一个一不小心从传统媒体进入互联网的新手,今后还要多向各位请教. 下面说说我的经历:我的经历比较草根,19岁开始教了三年书,做了9个月的乡干部,8年记者,去年国庆节辞去重庆晚报首席记者,专职运营猪八戒网 . 猪八戒网其实很简单,就是一个服务类的电子商务网站,和淘宝不同的是,在我们网站上交易的不是实物,而是服务.而交易的方式,就是悬赏竞标式.猪八戒网早在2005年就有了,当时只是我的一个个人博客站,我用OBLOG程

学习CSS优化的十八项技巧

css|技巧|优化 一.使用css缩写 使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.css缩写的主要规则请参看<常用css缩写语法总结>,这里就不展开描述. 二.明确定义单位,除非值为0 忘记定义尺寸的单位是CSS新手普遍的错误.在HTML中你可以只写width=100,但是在CSS中,你必须给一个准确的单位,比如:width:100px width:100em.只有两个例外情况可以不定义单位:行高和0值.除此以外,其他值都必须紧跟单位,注意,不要在数值和单位之间加空格. 三.区分大