栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++之指针和自由存储空间

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++之指针和自由存储空间

1.指针是一个变量,用来存储值的地址。

下面我们来看一下常规变量的地址(取地址运算符&)

#include
using namespace std;
int main()
{
	int donuts = 6;
	double cups = 4.5;
	cout << "donuts value= " << donuts << " and donuts address= " << &donuts << endl;
	cout << "cups value= " << cups << " and cups address= " << &cups << endl;
	return 0;
}

在指针前加*可以取出该地址处存储的值。

如下代码:

#include
using namespace std;
int main()
{
	int updates = 6;
	int *p_updates;
	p_updates = &updates;
	cout << "Value:updates= " << updates << endl;
	cout << "*p_updates= " << p_updates << endl;
	cout << "Address:&updates= " << &updates << endl;
	cout << "*p_updates=" << *p_updates << endl;
	*p_updates = *p_updates + 1;
	cout << "Now value:updates= " << updates << endl;
	return 0;
}

由以上代码可以看出,整型变量updates和指针变量p_updates代表一枚硬币的两面,updates表示值,而p_updates表示地址,并用*运算符来获得值。

2.指针的危险。

long *fellow;//create a pointer-to-long
*fellow=23233;//place a value in never-never land

以上代码指针所指向的地址并不明确。

警告:在对指针的内容操作之前,一定要确保指针所指向的地址是确定的。

3.指针和数字。

从概念上来看,指针与整数是两种截然不同的类型。

4.使用new来分配内存空间。

指针主要用于在运行阶段分配未命名的内存来存储值。在C语言中可以使用malloc()来分配内存空间,而C++还有更好的方法----new运算符。

例如:在运行阶段为一个int值分配未命名的内存,并用指针来访问这个值。程序员要告诉new,需要为那种数据类型分配内存,new将找到一个长度正确的内存块,并返回该内存块的地址。

int *pn=new int;

new int告诉程序,需要存储int的内存,new运算符根据类型来确定需要多少字节的内存。然后他找到这样的内存,并返回其地址。

下列代码将展示new的用法:

#include
using namespace std;
int main()
{
	int nights = 1001;
	int* pt = new int;
	*pt = 1001;
	cout << "nights value= " << nights << ":location=" << &nights << endl;
	cout << "int value=" << *pt << ":location=" << pt << endl;
	double* pd = new double;
	*pd = 10000001.0;
	cout << "double value=" << *pd << ":location=" << pd << endl;
	cout << "locatin of pointer pd=" <<&pd << endl;
	cout << "sizeof pt=" << sizeof(pt) << endl;
	cout << "sizeof *pt=" << sizeof(*pt) << endl;
	cout << "sizeof pd=" << sizeof(pd) << endl;
	cout << "sizeof *pd=" << sizeof(*pd) << endl;
	return 0;
}

对于指针,new分配的内存块通常与常规变量声明分配的内存块不同,变量nights和pd的值都存储在stack的内存区域中,而new分配的内存在heap之中。

5.使用delete释放内存。

delete运算符使得在使用完内存后,能够将其归还给内存池。

例如:

int *ps=new int;
......
delete ps;

这将释放ps指向的内存,但不会删除ps本身。

new与delete一定要配对使用。

6.用new来创建动态数组.

如果程序只使用一个值,则只需声明一个简单变量。但对于大型数据(如数组,字符串和结构体),应使用new.

  • 在编译时给数组分配内存空间被称为静态联编。
  • 在运行阶段给数组分配内存空间成为动态联编。

使用new来创建动态数组的方法:

int *psome=new int[10];

delete [] psome;

使用new和delete时,遵循以下规则:

  • 不要使用delete来释放不是new分配的内存。
  • 不要使用delete释放同一个内存块两次。
  • 如果使用new[]为数组分配内存,则应使用delete[]来释放。
  • 如果使用new为实体分配内存,则应使用delete来释放。
  • 对空指针应用delete是安全的。

下面代码展示了如何通过指针来访问动态数组:

#include
using namespace std;
int main()
{
	double *p3=new double[3];
	p3[0] = 0.2;
	p3[1] = 0.5;
	p3[2] = 0.8;
	cout << "p3[1] is " << p3[1] << endl;
	p3=p3 + 1;
	cout << "Now p3[0] is " << p3[0] << endl;
	cout << "Now p3[1] is " << p3[1] << endl;
	p3 = p3 - 1;
	delete[] p3;
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025959.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号