c 指標 陣列 陣列指標以及const限定符

2021-08-18 07:41:55 字數 2678 閱讀 6938

今天被指向字串陣列的指標怎麼寫給搞懵了,索性花點時間把一堆指標給梳理了一下。

從最簡單的開始,指向變數和陣列的指標。

注釋裡常指標代表指標本身是常量(網上有各種不同的說法所以我直接用了自己習慣的叫法)

/***********單一指標***********/

int a = 1;

int b = 2;

const int c = 3;

int *p1 = &a;//指向變數的變指標,指標可以修改值,也可以修改指標指向的值

//*p1 = 2; valid

//p1 = &b; valid

//p1 = &c; invalid 不能把常量位址賦給指向變數的指標

const int *p2 = &a;//指向常量的變指標,指標可以修改值,但不可以修改指標指向的值

//*p2 = 3; invalid

//p2 = &b; valid 可以將變數的位址賦給指向常量的指標

//p2 = &c; valid

int d[5];

int * const p3 = d;//指向變數的常指標,指標本身不可以被修改,但可以修改指標指向的值(陣列名等同於這個寫法)

//int * const p3 = &c; invalid 型別不匹配,p3指向變數而c是常量

//int * const p3 = &a; valid 可以將變數的位址用於指向變數的常指標初始化,但是初始化後指標不可被修改

//*p3 = 6; valid; 指標指向變數,因此可以用指標修改變數的值

//p3 = &a; invalid 指標不可被修改

const int * const p4 = &c;//指向常量的常指標,指標不可以被修改,指標指向的值也不可以被修改

接著是指向指標的指標

/************指向指標的指標***********/

int **p5 = &p1;//指向int *型別的變指標

//int *s = p1; p5 = &s; valid

//*p5 = &a; valid

//**p5 = a; valid

//由於沒有限定符,p5自身能被修改,指向的指標也可以被修改,指向的指標指向的值也可以被修改

int * const *p6 = &p3;//指向int *const型別的變指標

//int * const s = p3; p6 = &s; valid

//int * const s = p3; *p6 = s; invalid

//int s = 5; **p6 = s; valid

//p6自身能被修改,p6的限定符在第乙個*和第二個*之間,這個限定符限定的是它右邊的*p6,因此*p6是常量不可被修改,而**p6是變數可以被修改

int ** const p7 = &p1;//指向 int *型別的常指標

//int *s = p1; p7 = &s; invalid

//int *s = p1; *p7 = s; valid

//int s = 5;**p7 = s; valid

//const限定符限定的是p7,因此p7不能被修改,而*p7和**p7可以被修改

const int **p8 = &p2;//指向 const int *型別的變指標

int const **p9 = &p2;//等同上

//const限定的是**,因此p9和*p9可以被修改,而**p9不可以

const int * const * const p10 = &p1;

//完全限定,沒有任何值可以被修改

通過對指向指標的指標的研究發現。const限定符限定它右邊的目標。而且不會穿過一層解除引用符號。比如const **p就是指**p為常量,但是*p和p是變數,不受const限制。如果要限定為常量,則需要寫成const *const *p和const **const p。

最後是指標陣列

/**********指標陣列***********/

int *p11[2];//變指標陣列,陣列不能容納常指標

int **const p12 = p11;//等同變指標陣列名

const int *p13[4];//常指標陣列,陣列既可以容納常指標也可以容納變指標

const int **const p14 = p13;//等同常指標陣列名

結合總結1的結論以及指標陣列的研究,可以看出陣列名可以和*const互換。

1、讀任意乙個指標,從指標名開始從右往左讀。遇到const限定符則說明當前指標為常指標,遇到解除引用符『*』則往上指一層。

2、const 和 變數型別之間沒有"*"的時候可以交換順序。

以任意指標為例:const int ** const * p。這個指標p是變指標,而*p被const限定因此不能被修改。**p是變指標,將const 和int交換,看出const限定了***p,因此***p是常量不能被修改。

3、*const 可以被視為放在後面

例如int *const *const p,可以被視為p,也就是說p是int型別的二維陣列的陣列名。

4、寫乙個變數或者指標的指標,只需要在這個變數或指標的型別後面加*,如果要限定這個指標為常量,則加*const

c 陣列指標 指標陣列 函式指標

優先順序比 高,低於 根據這個原則去判斷 陣列指標 陣列指標即陣列的指標,是乙個指標,指向乙個陣列 也稱為行指標 int p 2 可以理解為int 2 p,但是不能這樣子定義 p是乙個指標,指向乙個陣列,陣列元素是int長度為2 二維陣列可以賦值給陣列指標 int a 3 4 int p 4 p a...

陣列,指標,指標陣列,陣列指標

指標是在32位系統下佔四個位元組,64位系統下佔八個位元組的一種型別,指標指向的內容可以是常量,變數,函式,結構體,指標本身,陣列,等等.一級指標 一級指標常常在函式傳參時使用,可傳的引數有一維陣列,常量指標,函式指標等等都可以 但我們要注意不要在函式中,通過改變形參的指向來達到改變實參指向的效果,...

指標陣列以及指向指標的指標

include include define maxlines 5000 進行排序的最大文字行 char lineptr maxlines 指向文字行的指標陣列 int readlines char lineptr,int nlines void writelines char lineptr,in...