ITPub博客

首页 > Linux操作系统 > Linux操作系统 > c++学习之指针

c++学习之指针

原创 Linux操作系统 作者:lihuiitpub 时间:2009-08-21 13:19:54 0 删除 编辑
int *pAge=0;
定义了一个存储int类型的指针变量,并赋值0.注意一定要赋初值,以免变成失控指针(wild pointer)
unsigned short int * pAge = 0;
所有的指针的长度是相同的,32位处理器是4字节,64位处理器上是8字节。
指针的类型告诉编译器,它存储的地址处的对象需要多少内存。如上面例子说明该指针(存储地址需4字节)存储了一个类型位unsigned short int的对象的地址,该对象本身需要2字节。
* 间接运算符也称为解除引用(dereference)运算符。对指针解除引用时,将得到指针存储的地址处的值
int yourAge;
youAge = *pAge;
*pAge就相当于howAge,得到的是其值,而不是地址。
区分指针、其存储的地址以及其存储的地址处的值!这个是指针比较容易迷糊的主要根源。
int theVariable = 5;
int *pPointer = &theVariable;
申明一个int变量theVariable,其值为5;什么一个int指针pPointer,其值为变量theVariable的地址。那么指针存储的地址处的值为5.
将*pPointer等同与theVariable看待。
为什么用指针?指针常用来做:
》管理自由存储区中的数据
》访问类的成员数据和函数
》按引用传递参数
按“函数的工作原理”一节中提到5个内存区域
#全局名称空间 :全局变量
#自由存储区   :余下所有内存都被称作自由存储区,通常被称为堆
#寄存器       :用于内部管理工作,如记录栈顶指针和指令指针
#代码空间     :代码
#堆栈         :局部变量和函数参数
函数返回时,堆栈被自动清空,局部变量将被删除。这样优点在于不用为管理这种空间而劳神,不足是在函数在不将堆中的对象复制到调用函数中的目标对象的情况下,将难以创建供其他对象或函数使用的对象。
全局变量在整个程序中都可以访问,这样也导致创建了难以理解和维护的代码。
自由存储区中需要程序员申请空间,并且还得负责将其释放。申请空间内的变量将保持到被释放或者到程序结束。这样,在函数中分配的自由存储区的数据在函数返回后仍可以使用。
new unsigned int *pPointer ;
pPointer = new unsigned int;
或者 unsigned int *pPointer = new unsigned int;
new返回的是一个地址。该命令用来申请一个自由存储区的空间,空间大小由其后的类型决定。
delelte pPointer;
该命令用于释放pPointer指向的空间。但是,指针仍然存在!
!!!对指针用一次delete会释放它指向的空间,用两次程序就将崩溃!故而在用一次delete后应将其值设置为0(空指针)。将delete用于空指针是安全的。
切记:用new分配的内存不会自动释放!
Animal *pDog = new Animal;//allocate memory
delete pDog;              //frees the memory
pDog = 0;                 //sets pointer to null
//...
delete pDog               //harmless
防止内存泄露一定做到程序中的每个new都有对应的delete,还应随之给出赋值动作,如0或者其他有效值。
常用办法是:
在构造函数中初始化指针,在对象被使用时为这些指针分配内存,在析构函数中检查指针是否为空,如果不为空则释放他们。
new将自动调用构造函数,delete将自动调用析构函数。
int main()
{
SimpleCat Frisky;                   //申明时自动调用构造函数
SimpleCat * pRages = new SimpleCat; //使用new时自动调用构造函数
delete pRages;                      //使用delete时自动调用析构函数
return 0;                           //函数返回退出时自动调用析构函数
}
访问数据成员
必须先对指针解除引用,然后结合使用解除引用得到的值(指针指向的值)和句点运算符来访问对象的成员。
(*pRages).GetAge();  // (*pRages)相当于一个变量名
c++中提供了一个间接运算符->来简化上面的样式。该运算符只用于指针访问类成员对象和数据。
pRages->GetAge();
每个类成员函数都有一个隐藏的参数:this指针。this指向当前对象。
class Rectangle
{
...
void SetLength(int length)
  { this->itsLength = length; }
int GetLength (int length) const
  { return this->tisLength; }
void SetWidth(int width)
  { itsWidth = width; }
int GetWidth (int width) const
  { return itsWidth; }
...
}
上面例子中语法不同(后者更简单),但是行为上没有任何差别。
const指针
const右边是类型,则值是常量,const右边是指针变量,则指针本身是常量。
const int * pOne; pOne是一个指向整型常量的指针。他指向的值是不能修改的。
int * const pTwe; pTwo是一个指向整型的常量指针。他指向的值可以修改,但pTwo不能指向其他变量。
const int * const pThree;pThree是一个指向整型常量的常量指针。他指向的值不能修改,且这个指针也不能指向其他变量。
如果声明一个指向const对象的指针,则通过该指针只能调用const方法。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16856446/viewspace-612828/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-19

  • 博文量
    113
  • 访问量
    191446