指针的概念
C++的学习过程中,最难的一个部分就是摸清指针的概念。
指针是一个变量,但是它储存的是对应的值的地址,而不是值本身。一般可以见到的如int型、char型的变量,其对应的值都是一个数值,或某串有意义的字符。指针所对的数值代表的是一段地址,代表的是它所指向的数据在内存中的放置位置,“指向了”一个变量。
因此,指针也是一种数据类型,具有指针类型的变量被称为指针变量。
提取地址的运算符
假设man是一个变量,利用&man就代表它的地址。下面是C++ primer plus中的一段代码,在这里对它进行了简化。
#include<iostream>
using namespace std;
int main()
{
int donuts = 6;
double cups = 4.5;
cout<<"donuts value = "<<donuts;
cout<<" and it's address is "<<&donuts<<endl;
cout<<"cups value = "<<cups;
cout<<" and it's address is "<<&cups<<endl;
return 0;
}
该段代码的输出结果为
donuts value = 6 and it's address is 0x0065fd40
cups value = 4.5 and it's adress is 0x0065fd44
这里可以看出&运算符的使用方法和作用效果。
指针的大小
不管是什么类型的指针,其大小只与所用的编译环境位数有关,32位编译系统为4个字节,64位操作系统为8字节。
指针的使用
“*”为指针运算符,是一个一元操作符,表示指针所指向的对象的值。
假如要声明一个指针,需要如下操作:
int* ptr
int声明了指针的类型,ptr的类型是指向int的指针,即int*。
ptr是一个指针,其代表的值是一个地址。*ptr是一个int类型的值,而不是指针。
如果想同时声明两个指针,如下的操作是错误的
int* p1, p2;
这样只会产生指针p1和int型p2.
同时,未进行初始化的指针与未初始化的变量一样,会有一段垃圾数据包含其中,但是在指针中,这一段垃圾数据意味着很可能是一个地址,如果指向了一个无意义的地址,可能对运行的影响不大,但是很有可能指向的是一个很重要的地址,从而导致程序出现bug甚至计算机死机。
因此,在使用指针之前先将其初始化是一个良好的习惯,操作方法有下面几种。
第一种是将一个新变量的地址赋予指针。
int a;
int* p = &a;
还有一种是将指针的地址放到一块新开辟的内存空间中。
int* p = NULL;
也可以利用new方法开辟新的内存空间。
int* p = new int;
new根据类型来确定需要的内存,在找到内存后将地址返回,并将地址赋给指针。但计算机有时候会出现内存被耗尽的情况,这时就没有多余的内存给new。所以在new指针用完后,使用delete函数将内存释放。注意,new和delete要配对使用。
最后强调一下,指针p本身代表的是一个地址,要解出p指向地址所代表的值需要使用*p语句,星号本身只是一个运算符