指针_引用_内存管理new_delete

指针是C++语言中广泛使用的一种数据类型。运用指针编程是C语言的主要风格之一。指针可以表示各种数据结构,除了简单的整型、字符型等,也能很方便地使用数组和字符串,并像汇编语言一样处理内存地址,从而编出精炼而高效的程序。

在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。

接下来就是指针的官方定义:

正如之前介绍的,既然根据内存单元的编号或地址就可以找到所需的内存单元,所以我们通常就把这个地址称为指针。 内存单元的指针和内存单元的内容是两个不同的概念。严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。

#include<iostream>
using namespace std;
void square(int * n){
    *n=*n * *n;
}
int main(){
    int num = 2;
    cout<<"The original number is "<<num<<endl;
    square(&num);
    cout<<"The new value of number is "<<num<<endl;
    return 0;
}
#include<iostream>
using namespace std;
int square(int n){
    return n*n;
}
int main(){
    int num = 2;
    cout<<"The original number is "<<num<<endl;
    num=square(num);
    cout<<"The new value of number is "<<num<<endl;
    return 0;
}

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。

引用的声明方法:
类型标识符 &引用名=目标变量名

例如:
int a,&ra=a;
a为目标原名称,ra为目标引用名。给ra赋值:ra=1;等价于 a=1。

在这里,有几个关键点需要注意:

1.请特别区分这里的&与求地址符号的区别,在这里&只是在声明时起标识作用。

2.声明一个引用,不是新定义了一个变量,它本身不是一种数据类型;不同于指针,它只表示该引用名是目标变量名的一个别名,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,将得到源目标变量地址。也就是说,上面的实例后,我们输出&ra或&a将得到相等的结果。

3.不能建立引用的数组。因为数组是一个由若干个元素所组成的集合,所以无法建立一个由引用组成的集合。但是可以建立数组的引用。

#include<iostream>
using namespace std;
void square(int &n){
    n = n * n;
}
int main(){
    int num = 2;
    cout<<"The original number is "<<num<<endl;
    square(num);
    cout<<"The new value of number is "<<num<<endl;
    return 0;
}

计算机中的内存在用于编程时,被人为的进行了分区(Segment),分为:“栈区”(Stack)、“堆区”(Heap)、全局区(静态区,Static)、文字常量区和程序代码区。在前面的课程中,我们主要直接涉及到的是栈区的内存,在你的程序中,函数的参数值,局部变量的值等都被存在了“栈区”,这部分的内存,是由系统来帮助你来管理的,没有特殊情况的时候,你是不需要对其进行特别处理的。
这里写图片描述

而针对堆区的内存,一般由程序员进行分配和释放, 使用堆内存的原因一般是“栈上内存比较小,不够用”、“系统管理内存的方式死板,不方便用”这两大类原因。对于堆上的内存,被程序员手动分配后,若程序员不释放就可能会出现“内存泄漏”。很多企业级的应用,都因为内存泄漏而在“正常”运转很长时间后,轰然“坍塌”。

全局区、文字常量区和程序代码区在我们入门阶段,暂时还可以不去过多理解(甚至看不懂也无妨),只需要知道他们的大致作用即可——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放;文字常量区是用于储存常量字符串的, 程序结束后由系统释放;程序代码区用于存放函数体的二进制代码。

C++语言中用new这个关键字来动态申请分配堆内存,我们在前面的课程中已经用过。相比C语言,C++中内存分配的方式就简单的多了。

申请单个对象
int *p;
p = new int;

或者你还希望直接在申请的堆内存里直接包含值,比方说一个整数100,你可以写成
int *p;
p = new int(100);

动态申请数组
int *p;
p = new int[n];

这样对于一个已经申明的变量n可以申请长度为n的动态数组,就和前面课程学习过的一样;但是这里不能进行初始化。

在这里,请注意一下new后类型后,一个值在圆括号和方括号里的区别。圆括号里值是用来赋初值的,方括号里是用来说明申请堆空间的大小的。

另外,不知道你还是否记得,动态开辟的堆上空间是必须要释放的,否则将造成内存泄漏。

#include<iostream>
using namespace std;
int main(){
    int i,n;
    cin>>n;
    int *arr= new int[n];

    //以下代码对一个数组第一位进行了赋值
    arr[0]=1;
    //以下代码对一个长度为n的数组第二位开始依次做计算,并输出最后一个值结果
    for(i=1;i<n;i++){
        arr[i]=arr[i-1]+i;
    }
    cout<<arr[n-1];
    //请在下一行释放内存空间
    delete []arr;
    arr=NULL;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值