【博文连载】C++中的“指针”

指针是用来保存内存地址的变量。每个被定义的变量都有自己的地址,可以用指针来存放任何被定义的变量的地址。如(p存放的是变量的地址,*p存放的是变量的数据。):

int a;  //  定义一个整型变量aint *p; //  定义一个指向整型变量的指针pp = &a; //  将变量a的地址赋给变量p

定义一个指针后一定要用它保存一个内存地址,如果不那么做的话,那么该指针就是一个失控指针,它可以指向任何地址,并且对该地址的数值进行修改或者删除,可能会造成意想不到的后果。所以,可以将指针初始化为0,如:

int *p; p = 0;或者int *p = 0;

由于不同类型的变量在内存中所占用的字节不同,而指针又是用来保存内存地址的变量,因此指针只能存储与它类型相同的变量的地址。

注意区分指针地址、指针保存的地址和该地址的值,如:

int a = 1;int *p = &a;cout << "指针地址:" << &p << endl;cout << "指针保存的地址:" << p << endl;cout << "指针保存地址的数值:" << *p << endl;

为什么使用指针?因为在操作大型数据和类时,指针可以通过内存地址直接访问数据,可避免在程序中复制大量的代码,因此指针的效率最高。一般来说,指针会有3大用途:

(1)处理堆中存放的大型数据;

(2)快速访问类的成员数据和函数;

(3)以别名的方式向函数传递参数。

如何使用堆?首先创建一个堆,然后定义一个指向该堆的指针,最后通过该指针就可以访问堆中的数据。在C++中使用关键字new创建一个堆并分配内存,在new后面跟一个要分配的对象类型,编译器根据这个类型来分配内存。如:

int *p;p=new int; 或int *p=new int; //  分配了四个字节的内存空间

由于使用new创建的内存空间不会被系统自动释放,因此假如不去释放它,那么该区域的内存将始终不能为其他数据所使用,而指向该内存的指针是个局部变量,当定义该指针的函数结束并返回时,指针也就消失了,从而再也找不到这块内存区域,这种情况叫做内存泄漏。因此,当不需要一块内存空间,可以使用关键字delete释放该内存空间(不要再次对该指针进行删除,因为它所指向的内存区域已经被释放,如果再进行释放,将会使程序崩溃。但是,如果将该指针赋为0的话,那么删除一个指针是安全的。),但不会释放该指针,指针可以继续使用。另外,当用delete释放一个指针所指向的空间后,最好将该指针的内存地址清0。如:

int *p=new int;delete p;p=0;

还可以在堆中创建对象(创建对象时会自动调用类的构造函数来初始化对象的成员数据),如下,定义了一个Human类的指针p,指向new创建的内存空间。占用内存大小由Human类对象的成员变量来决定。

Human *p;p=new Human; 或Human *p=new Human;

如果要删除在堆中创建的对象,可以直接删除指向该对象的指针,这样会自动调用对象的析构函数来销毁该对象,同时释放内存。

可以通过指针变量访问堆中创建的对象,如下,其中->是成员指针运算符,利用该符号可以实现读取对象的内存地址并且访问该对象的成员的作用。

(*p).get();或p->get();

指针可以进行加减操作,如下,定义了一个指针并指向int型变量,执行加1操作,会将原来的内存地址增加4个字节;执行减1操作,会将原来的内存地址减少4个字节。

int *p=new int;p++;p--;

常量指针是指该指针不可改变,但其指向的数据可改变,如下:

int *const p;

指向常量的指针是指该指针可改变,但其指向的数据不可改变,如下:

const int *p;

指向常量的常指针是指该指针不可变,其指向的数据也不可变,如下:

const int * const p;

 招聘信息 

 

(0)

相关推荐

  • C++中const的用法

                         时间:2021-02-27 13:32:39         简介 Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类 ...

  • 嵌入式面试总结(持续更新)

    嵌入式面试总结(持续更新)

  • 【博文连载】中值滤波算法的介绍

    言归正传,我们先挑一个相对最简单的滤波算法(其实均值滤波更简单,但是它对边缘的保持太差,那就稍微努力点用中值滤波吧).进行中值滤波不仅可以去除孤点噪声,而且可以保持图像的边缘特性,不会使图像产生显著的 ...

  • 【博文连载】C++中的“命名空间”

    命名空间主要解决命名冲突的问题.命名空间可以存放类.对象.函数.变量.结构体等.假如要使用命名空间中的变量或者对象,那么使用using namespace来指定某个命名空间,释放该命名空间中所有的变量 ...

  • 【博文连载】C++中的“栈与堆”

    一般来说,写程序就是与数据打交道,在执行程序某一功能的时候,将该功能所需要的数据加载到内存中,然后在执行完毕的时候释放掉该内存. 数据在内存中的存放方式有以下几种: (1)栈区--由编译器自动分配并且 ...

  • 【博文连载】C++中的“引用”

    引用就是别名,如下,rnum是num的别人,对rnum的操作实际就是对num的操作.这里的&是引用运算符,不是取址运算符. int num = 1;int &rnum=num; 还可以 ...

  • 【博文连载】DDR3中的ODT动态模式详解

    首先举一个例子: 早期的DDR(注:DDR2开始支持ODT功能),当向内存写入数据时,如果只有一条内存,那么这条内存就自己进行信号的终结,终结电阻等效为150Ω.如果为两条内存,那么他们会交错的进行信 ...

  • 【博文连载】PCIe扫盲——PCI总线中的Reflected-Wave Signaling

    PCI Spec规定了每个PCI总线上最多可以连接多达32个PCI设备,但是实际上却远远达不到32个,33MHz的32位PCI总线一般只能连接10到12个负载. 注:如果使用插槽连接,则一个连接算两个 ...

  • 去掉视频中鼠标指针的方法

    去掉视频中鼠标指针的方法

  • 如何利用c中的指针实现两个8bit的数合并为16bit

    对于从事单片机开发,进行单片机c语言开发的人来说,在对外部信息采集回来的数据进行处理,经常会用到,将采集到的第一个字节作为高8位,采集到的第二个字节作为低8位,从而构成1个16bit的数,得到一次完整 ...

  • C 11中智能指针的原理、使用、实现

    目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C 程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序的 ...