C++基础——指针

  1. 指针的声明

数据类型识别符 *指针变量名 例:int *p_ipoint;//声明一个整形指针

  1. 指针的赋值

第一种赋值方式 在初始化的时候赋值

int i=100;  int *p=&I;

第二种赋值方式 在后期赋值

int i=100; int *p; p=&I;

说明:通过变量名访问一个变量是直接的,而通过指针访问一个变量是间接的。

  1. 关于指针使用的说明。

指针变量名是p,而不是*p,p=&i的意思是取变量i的地址赋給指针变量p。例:

#include <iostream>

 

int main()

{

    int i = 100;

    int *p = &i;

    printf("%d\n",p);

}

指针变量不可以直接赋值。例:

int i = 100;

    int *p;

    p = 100;

编译不能通过,错误如下:

    int *p;

    p =(int*)100;//通过强制转换将100赋值给变量指针。

    printf("%d", p);//输出地址,能够输出地址

    printf("%d", *p);//输出指针指向的值,出错语句

不能将*p当变量使用。例:

int *p;

    *p =100;//指针没有获得地址。

    printf("%d", p);//输出地址,出错语句

    printf("%d", *p);//输出指针指向的值,出错语句

  1. 指针运算符和取地址运算符

*是指针的运算符,&是取地址运算符。

声明并初始化指针变量是同时用到了*和&这两个运算符。例:

int *p=&a;

该语句等同于如下语句:

int *(p=&a);

如果写成*p=&a,程序就会报错。

&*p中的p只能是指针变量,如果将*放在变量名前,编译的时候会有逻辑错的。

注意:&*p和*&a的区别。

&和*的运算符优先级别相同,按自右而左的方向结合,因此&*p是先进行*运算,*p相当于变量a;再进行&运算,&*p就相当于取变量a的地址。*&a是先计算&运算符,&a就是取变量a的地址,然后计算*运算,*&a就相当于去变量a所在地址的值,实际就是变量a。

  1. 指向空的指针与空类型指针

指针可以指向任何数据类型的数据,包括空类型(void):

void* p;  //定义一个指向空类型的指针变量。

空类型指针可以接受任何类型的数据,当使用它是,可以将其强制转换为所对用数据类型。例:

#include <iostream>

using namespace std;

int main()

{

    int *pl = NULL;

    int i = 4;

    pl = &i;

    float f = 3.333f;

    bool b = true;

    void *pV = NULL;

    cout << "依次赋值给空指针" << endl;

    pV = pl;

    cout << "pV=pl------" << (int*)pV << endl;

    cout << "pV=pl-------转为float类型指针" << *(float*)pV << endl;

    pV = &f;

    cout << "pV=&f--------" << *(float*)pV << endl;

    cout << "pV=&f------转为int类型指针" << *(int*)pV << endl;

    return 0;

}

  1. 指向常量的指针与指针常量、

同其他数据类型一样,指针也有常量,使用const关键字形式如下:

int i=9;

int* const p=&i;

*p=3;

将关键字const放在标识符前,表示这个数据本身是常量,而数据类型是int*,即整形指针。与其常量一样,指针常量必须初始化。我们无法改变他的内存指向,但是可以改变它指向内存的内容。

   若将关键字const放到指针类型的前方,形式如下:

           int i=9;

           int const* p=&i;

   这是指向常量的指针,虽然它所指向的数据可以通过赋值语句进行修改,但是通过该指针修改内存内容的操作是不被允许。

   当const以如下形式使用时:

int i=9;

int const* const p=&i;

该指针是一个指向常量的指针常量。既不可以改变它的内存指向,也不可以通过它修改指内存的内容。

例:

#include <iostream>

using namespace std;

int main()

{

    int i = 5;

    const int c = 99;

    const int* pR = &i;//这个指针只能用来“读”内存数据,但可以改变自己的地址。

    int* const pC = &i;//这个指针本身是常量,不能改变指向,但是能够改变内存的内容。

    const int* const pCR = &i;//这个指针只能用来“读”内存数据,并且不能改变指向

    cout << "三个指针都指向了同一个变量i,同一块内存" << endl;

    cout << "指向常量的指针pR操作:"<<endl;

    cout << "通过赋值语句修改i:" << endl;

    i = 100;

    cout << "i:" << endl;

    cout << "将 pR的地址变成常量c的地址:" << endl;

    pR = &c;

    cout << "*pR:" << endl;

    cout << "指向常量的指针pC操作:" << endl;

    cout << "通过pC改变i值:" << endl;

    *pC = 6;

    cout << "i:" << i << endl;

    cout << "指向常量的指针常量pCR操作:" << endl;

    //pCR=&c;        //报错

    //*pCR=100;      //报错

    cout << "通过pCR无法改变任何东西,真正做到了只读" << endl;

    return 0;

}

 

猜你喜欢

转载自blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/107404157