赞
踩
目录
最近又看了一下数据结构,总结了数据结构中需要了解的知识点。
程序中一般通过变量名来对内存单元进行存取操作。其实程序经过编译后已经将变量名转成变量的地址。系统根据程序中定义的变量类型,在内存中分配存储空间。程序编译后,变量名就不起作用了,采用地址取值。按照变量地址直接取值的方式称为直接存取方式,或者直接访问方式。
除了直接访问的方式存取之外,C++中还有一种专门存地址的变量可以简介的访问变量。这个变量也就是指针变量。
简单的来说,变量的地址就是该变量的指针。存放地址的变量称为指针变量。
指针变量的声明方式如下:
数据类型 * 变量名;
例如:在下面的代码中,指针变量i_pointer指向的地址的数据类型是int。指针变量j_pointer指向的地址的数据类型是char。
- int *i_pointer;
- char *j_pointer;
指针变量有两种赋值方法:
既可以在定义时候初始化,例如:
- int i;
- int j;
- int * i_pointer = &i;
- int * j_pointer = &j;
也可以在非定义的时候初始化,例如:
- int i;
- char j;
- int * i_pointer;
- char * j_pointer;
- i_pointer = &i;
- j_pointer = &j;
需要注意的是不能使用一个整数给一个指针变量赋值。
指针运算符有两个:&和*。
运算符&用于返回其操作对象的内存地址,其操作对象通常为一个变量名。例如:
ptr = & total;
运算符*用于返回其操作数所指向的对象的值。
指针可以进行p+n和p-n操作,分别表示的是指针指向后面(前面)n个元素。
相同类型的指针变量类型之间可以互相赋值,表示两个指针变量指向内存中的同一个地址。
两个指向同一类型的指针变量可以进行==、>、<等关系运算,其实就是地址的比较。
指针之间可以进行相减比较,结果为两个指针之间相差的元素个数。
C++中,数组元素的指针就是数组元素的地址。
例如在下面的代码中:
int a[10];
int * p;
p = &a[0];
和下面的代码是等价的。
int a[10];
int * p;
p = a;
除此之外,数组名还可以作为参数传递。当将数组名传递给函数的时候,实际上所传递的事数组的首地址。在大量数据传递的时候,指针的效率要比传递数据效率要高得多。
C++中使用new和delete运算符来实现动态存储分配。
动态存储分配步骤如下:
1.定义一指针变量
2.采用new申请一片内存空间,并将其首地址赋值给指针变量。
3.使用delete删除动态分配的存储空间。
格式如下:
指针变量 = new 类型;
例如我们可以声明指针变量的时候赋初始值:
int * a;
a = new int(10);
也可以使用new关键字给数组赋值。
int * a;
a = new int[10];
由于动态分配的内存空间是堆内存或者自由存储区,通常数量是有限的。因此如果在程序中不断的分配堆内存就有可能将其耗尽。这个时候,系统无法再对new提出的堆内存分配请求给予满足,此时new会返回空指针NULL.所以我们分配之后,我们要判断下是否分配成功。
C++中使用new申请的动态存储,必须使用delete释放。这样做的目的是把闲置不用的堆内存归还给系统,可以使其重新分配。
使用delete释放内存空间的语法格式为:
delete 指针变量;
例如:
int * a;
a = new int;
...
delete a;
释放数组占用的内存空间语法格式为:
delete[] 指针变量名;
例如:
int * a;
a = new int[10];
...
delete[]a;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。