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

c++中的指针、new与delete

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

c++中的指针、new与delete

c++中的指针、new与delete 指针

指针是一个变量,该变量存储的值是地址,并不是值本身,当然我们要首先来看如何获取变量的地址,。

#include 

int main(){
using namespace std;
int num; //声明一个int类型的变量;
num = 13; //为其赋值;

cout << "the address of num is " << &num << endl; 
//在变量num前加上&便可以取得该变量地址;
return 0;
}
the address of num is 0xffffcc0c //上述代码的输出(不同机器上的地址把不尽相同);

显示地址时, 该实现的cout使用的时16进制表示法,因为这是常常用于表示内存地址的表示法(当然如果你对机制方面的知识不是跟了解,你可参看这个文章http://usheethe.com/ftZx,该文章是转载的文章)。
在使用常规变量时(如 int、short int等), 值是指定的量,而地址则是派生的量,而指针则与其相反。
指针用于存储值的地址。因此指针名表示地址。*运算符称为“间接值”或者”解除引用“运算符,将其用于指针,可以得到该地址处的存储的值。

#include 

int main(){
int num = 13;
int * pt  = #

cout << "the address of num is " << pt << endl;//指针名表示num的地址;

cout << "the val  of num is " << *pt << endl;//通过*运算符解除引用,此时*pt等价于 num
//因此我们可以通过修改 *pt 来达到修改 num
*pt = *pt + 13;
cout << *pt << endl; //此时*pt值为16;
cout << num << endl; //num页为16引文 *pt等价于num;
 
return 0;
}

下面是图示理解:

指针的危险,指针的使用无疑会为我们带来便利,但是也会有危险。比如以下情况:

  long * num;
  num = 23323;

num此时是一个指针,但是它指向何处,你可能会说num存储的地址是23323,是的,但是23323处存储的东西对我们来说是未知的,如果我们者的这样做了,并且我们*num = long类型的值,那么以23323为开始地址的内存区域(4字节或者8字节,这取决于系统实现)就会被我们的值覆盖,如果,此时该区域正好是一段程序的代码部分,那么后果会很严重,这会导致程序出现非常奇怪的现象,或者使得程序崩溃。

new与delete

对于指针的工作方式有了一些了解后,我们来看看它如何实现在程序运行时分配内存。前面我们都将指针初始化为变量的地址如:
int * pt = &num ;而变量是在编译时分配的有名称的内存,而指针只是为可以通过名称直接访问的内存提供了一个别名。而指针的真正用武之地在于,在程序运行阶段分配未命名的内存来存储值。在这种情况下,只能通过指针来访问内存。在c语言中我们会使用malloc函数来分配内存, 在c++你仍然可以这样做,但是c++有更好的方法———new运算符。
在程序运行阶段,来为一个int值分配未命名的内存,并用指针访问它,可以这样做。

int * n_pt = new int;
//你可以为其赋值
*n_pt = 13;
//可以打印
cout << *n_pt << endl; //打印结果未13

需要指出的是,new分配的内存块通常与常规变量声明分配的内存块不同,例如 short int num = 123; 此时num被分配到一个称为栈的内存区域中,而 int * n_pt = new int; 此时n_pt所指向的内存块则被分配到一个成为堆或者自由存储区的内存区域。关于栈与堆内存区域的相关知识可以访问这个链接:http://usheethe.com/fvCv(转载)介绍的很详细,可以帮助您的学习。
既然有了new来分配内存,自然就有delete来释放内存,当被分配的内存没有用处时,可以通过delete运算符来释放内存。
由于被分配的内存是有限的*(即使你的计算机内存很大,但也会被耗尽,如果你只知道new而不知道delete)。

int * n_ptr = new int;
*n_ptr = 13;
....//中间一系列操做
delete n_ptr;//当不用时,要记得释放
....

接下来是用new来创建数组与释放数组

using namespace std;
int arr_size = 13;
int * arr_pt = new int [arr_size]; //创建了长度为13的int类型数组
arr_pt[2] = 13;
cout << arr_pt[2] << endl;
delete [] arr_pt //释放数组

需要注意的是,只有在使用new创建数组时[ ]内的值才可是变量,不采用new方式创建数组时可以有以下几种方式。

#define ARR_SIZE 13
int arr[ARR_SIZE]; //老式的c语言方式
--------------------------------
const int arr_size = 13;
int arr[arr_size] = {12, 13, ....};//声明并初始化
----------------------------------
int arr[13];

http://usheethe.com/fvh7 (转载 c++教程,基础知识很全面)
如果有更多疑问可私信。

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

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

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