指针变量:本身就是一个变量有自己的地址。
#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;