指针是一个变量,该变量存储的值是地址,并不是值本身,当然我们要首先来看如何获取变量的地址,。
#includeint 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等), 值是指定的量,而地址则是派生的量,而指针则与其相反。
指针用于存储值的地址。因此指针名表示地址。*运算符称为“间接值”或者”解除引用“运算符,将其用于指针,可以得到该地址处的存储的值。
#includeint 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++教程,基础知识很全面)
如果有更多疑问可私信。



