天天看点

指针常量和常量指针指针变量:本身就是一个变量有自己的地址。指向常量的指针和常量指针都是指针。

指针变量:本身就是一个变量有自己的地址。

#include <iostream>

using namespace std;


int main(){
	int a = 10;
	int *p = 0;//指针p指向一个存储整数数据的地址
	int **p1 = &p;

	cout << p << endl; //打印指针p指向的地址
	cout << &p << endl;  //打印指针变量p的地址,指针本身就是变量,有自己的地址
	cout << p1 << endl;  //二级指针存储指针的地址

	return 1;
}
           

参考:https://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int-const-int-const-and-int-const

指向常量的指针和常量指针都是指针。

常量指针(const pointer),英语里并没有 指针常量 这种说法,只有一个pointer to const(指向常量的指针)

*象征着地址,const象征着内容(值);谁在前面谁就不允许改变,

两者区别:

在星号 * 处拆分语句,那么,如果const关键字出现在左侧(如‘const int*foo’中)-它属于指向的数据,说明数据内容不可变,如果它位于右侧(‘int*const bar’)-它是关于指针指向不可变。

左定值,右定向

指向常量的指针 pointer to const

指针:常量的地址。

int const *ptr1;

const int *ptr1;

定义了一个指向常量的指针,区分时从右向左看,先被那个修饰就是那个,ptr1先被指针符*修饰,他就先是指针,再被const修饰。

指向常量的指针:该指针的内容(值)不可以被该指针修改,不能直接使用*ptr2=10修改,但可以改变指针的指向,指向一个新地址。

int c;
    // 常量定义时必须先初始化,const用来定义一个只读的变量或者对象
    const int a = 10;//使用了const定义后,在编译时会自动将这个变量a替换为10
    const int b = 20;

    // *************************指向常量的指针pointer to const ********************
    // 定义指向常量的指针,存放常量对象的地址,该地址的内容不能被该指针修改,但是可以修改指针的指向
    int const *ptr1  = &c;
    // 不通过指针直接修改变量值
    c = 100;
    std::cout <<"原来的c值"<< c << ",原来的c地址"<< &c << "也等于ptr1的地址" << ptr1 << endl;

    // 修改指针的指向
    ptr1  = &a;
    std::cout <<"原来的a值"<< *ptr1 << ",原来的a地址"<< ptr1 << endl;

    // *ptr1 = 20;//这样是错误的,指针的内容不可通过该指针修改
    ptr1 = &b;//这样是可以的,修改指针的指向
    std::cout <<"修改地址后ptr1的值"<< *ptr1 << ",原来的a地址"<< ptr1 << endl;
           

常量指针 const pointer

指针:是一个常量。

int * const ptr2 = &c;

定义了一个常量指针,区分时从右向左看,先被那个修饰就是那个,ptr2先被常量符const修饰,他就先是const,再被指针修饰。

常量指针:这个指针的指向不能被修改,始终指向初始化时的地址,可以使用*ptr1去修改该地址存储的值。

// *********************常量指针 const pointer*********************
    // 定义常量指针,指向的地址不可被修改,定义常量指针时,必须先赋值,不可以先定义后赋值
    int* const ptr2 = &c;//常量指针定义时需要初始化,初始化不能使用常量的地址
    // ptr2 = &a;//常量指针一旦定义其指向就无法修改,只能指向该地址,这里是错误的
    *ptr2 = 100; 
    std::cout << ptr2 << endl << &c << endl;