今天被指向字串陣列的指標怎麼寫給搞懵了,索性花點時間把一堆指標給梳理了一下。
從最簡單的開始,指向變數和陣列的指標。
注釋裡常指標代表指標本身是常量(網上有各種不同的說法所以我直接用了自己習慣的叫法)
/***********單一指標***********/
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...