天天看點

指針常量和常量指針指針變量:本身就是一個變量有自己的位址。指向常量的指針和常量指針都是指針。

指針變量:本身就是一個變量有自己的位址。

#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;