指针

来源:互联网 发布:免费网络空间 编辑:程序博客网 时间:2024/06/04 19:12

指针

  • 指针
    • 什么是指针
    • 指针的定义和初始化
    • 避免使用未初始化的指针
    • 初始化和赋值的约束
    • void指针
    • 指针操作
    • 使用指针访问数组元素
    • 指针是数组的迭代器
    • 指针和const限定符


什么是指针

指针用于指向对象。与迭代器一样,指针提供对其所指对象的间接访问,只是指针结构更加通用一点。
与迭代器不同的是,指针用于指向单个对象,而迭代器只能用于访问容器内的对象。

指针保存的是另一个对象的地址。
string *sp=&s;
//*表明sp是一个指针变量,&是取地址操作符(只能作用于左值)。

尽量避免使用指针和数组!多用vector和string。


指针的定义和初始化

指针需要有一个关联的数据类型,决定了指针所指向的对象的类型。(应该是因为不同类型所占的字节数不同)

注意:
int dp,dp2;//只有dp2才是指针,也就是说连续声明的时候,每一个指针前面都要用
最好是贴着变量名声明 int *dp2;


避免使用未初始化的指针

使用未初始化的指针,很容易导致程序崩溃。未初始化的指针,会将指针中存放的不确定值视为地址。

  • 不要提前定义指针
  • 如果一定要分开定义,那么要初始化为0值。

初始化和赋值的约束

  • 0值或NULL
  • 同类型的变量地址或另一指针

void*指针

它可以保存任何类型对象的地址。但是不允许使用void*指针操纵所指向的对象。


指针操作

  1. *解引用操作符,可以返回对象的值。
  2. 指针和引用的比较(两个重要区别)

    • 引用总是指向某个对象,一经初始化之后就始终指向同一个对象(所以引用必须在定义时初始化)。
    • 赋值的差异:引用赋值,修改的是对象的值。
  3. 指向指针的指针(多维)
    Int *ppi=new int[10];
    for(int i=0;i<10;i++)
    ppi[i] = new int[10];

*表明ppi是二维指针,那么*ppi指向的是一个指针,可以把*ppi看成一个大小为10的int数组,里面存储的都是int*指针。
如上便相当于声明了一个二维数组


使用指针访问数组元素

在表达式中使用数组名,名字会自动转换为指向数组第一个元素的指针(也就是代表那个元素的地址)。
当使用下表访问指针的时候,下标是可以为负的


指针是数组的迭代器


指针和const限定符

  1. 指向const对象的指针
    const double *cptr;
    这里的cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型,而非cptr本身。cptr并不是const。不能通过cptr修改对象的值。
    把一个const对象的地址给一个非指向const对象的指针也会编译错误。但是允许把非const对象的地址赋给指向const对象的指针(但是不能通过cptr修改这个对象的值)。
    指向const的指针常用作函数的形参

  2. const指针
    const指针本身的值不能被修改,即不能指向其它对象了。但是其对象的值还是可以修改的。
    与任何const量一样,const指针也必须在定义时就初始化。

  3. 指向const对象的const指针
    const double *const pi_ptr=& pi;
  4. 指针和typedef
    typedef string *pstring;
    const pstring cstr;
    这里const修饰的是pstring的类型,即修饰的是指针,等价于
    string *const cstr;
0 0
原创粉丝点击