指針變量:本身就是一個變量有自己的位址。
#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;