深度理解指標

2021-08-20 11:50:02 字數 2409 閱讀 2442

首先,指標是什麼呢?

我們看這樣一段**

#includeint main()

知道了這些以後,讓我們再來看幾個有關指標的定義。

指標陣列

指標陣列是陣列,是乙個存放指標的陣列。

舉個栗子:

int *arr1[10];//*表示每個陣列元素是一級指標,int表示指標指示的型別是整型

char *arr2[4];//*表示每個陣列元素是一級指標,char表示指標指示的型別是字元型

char **arr3[5];//**表示每個陣列元素是二級指標,char表示指標指示的型別是字元型

陣列指標

陣列指標是指標,是指向陣列的指標。

舉個栗子:

int (*p)[10];
//p先和*結合,說明p是乙個指標變數,然後指標指向的是乙個大小為10個整型的陣列。所以p是乙個指標,指向乙個陣列,叫指標陣列。

//需要注意的是,[ ]的優先順序要高於 * 號的,所以必須加上 ()來保證p先和*結合。

既然已經了解了陣列指標指標陣列之後我們來看看下面這些表示式表示的是什麼意思。

int arr[5];

int *parr1[10];

int (*parr2)[10];

int (*parr3[10])[5];

//這裡我就只解釋一下parr3

首先,parr3和[10]結合,表明parr3是乙個陣列,是乙個有10個元素的陣列。

然後,我們把 parr3[10] 刪去,得到 int (*) [5]  ,那麼這個就是該陣列每個元素的型別,顯然,這是陣列指標。

而這個陣列指標,指向的乙個有5個元素的陣列。

所以,這是乙個存放10個陣列指標的陣列,每個陣列指標指向乙個有5個元素的陣列。

接下來再看函式指標

函式指標,顧名思義,就是指向函式的指標。

舉個栗子:

void test()

int main()

//pfun1先和*結合,說明pfun1是指標,指向的是乙個函式,指向的函式無引數,返回值型別為void。

那麼來看兩段**:

//**1

(*(void(*)())0)();

//**2

void (*signal(int,void(*)(int)))(int);

有點複雜,你可以多思考一會兒。

以下是我個人的解釋,僅供參考。

//**1

把0強制型別轉換為函式指標(存著函式位址),*得到函式,就是在呼叫函式,該函式引數型別為空,返回型別為void。

//**2

signal是乙個函式的宣告,signal有2個引數,乙個是int ,乙個是 void(*)(int),即函式指標,

該函式指標指向的函式,有乙個int引數,返回型別為void。

我們把該函式刪去後得到 void (*)(int),即乙個函式指標,同時它也是該函式的返回型別。

即signal函式的返回型別為乙個函式指標,該函式指標指向的函式,有乙個int引數,返回型別為void。

你明白了麼?

當然 **2 過於複雜,所以我們可以稍微簡化一下,比較容易理解。

如下:

typedef void(*pfun_t)(int);//型別重定義,將函式指標重定義為 pfun_t 

pfun_t signal(int,pfun_t);//還原並簡化**

那麼其實還有函式指標陣列

函式指標陣列是乙個陣列,陣列中的每個元素的型別是函式指標。

舉個栗子:

int (*parr1[10])();
//parr1先和 [ ] 結合,說明 parr1是陣列,將該陣列名刪去,得到 int (*)( ) ,顯然,這是乙個函式指標,所以該陣列的每個元素都是乙個 int (*)( )型別的函式指標。

你理解了麼?

接下來最複雜的來了。

指向函式指標陣列的指標

一步步看下來的話,你應該也可以解釋清楚。

對的,指向函式指標陣列的指標,首先,它是乙個指標,該指標呢,指向乙個陣列,而陣列的每個元素都是函式指標。

舉個栗子吧:

void test(const char* str)

int main()

你看明白了麼?

稍微有一點複雜,慢慢理解,多思考,就明白了。

指標深度理解

指標陣列 乙個陣列,若其元素均為指標型別資料,稱為指標陣列。也就是說,指標陣列中每乙個元素都相當於乙個指標變數。其詳細形式應該如下 a 0 a n 每乙個陣列裡面儲存的是其指向的位址 一維指標陣列的定義形式為 型別名 陣列名 陣列長度 例如 int p 4 由於比 優先順序更高,因此p先與 4 結合...

C 指標的深度理解

筆者會從各種的例子和面試題入手,將逐步去分析指標的知識點和指標的一些高階的用法。第乙個例子,也許一些人會疑惑為什麼t是512了,先看下面的圖 從筆者自己畫的圖分析,引用 這個符號返回的是這個型別最低位的位址而不是最高位數的位址,還有就是int型指標和char型的指標的區別到底在 不同型別的指標唯一區...

深度理解指標及相關概念

2.指標變數 指標變數是變數,具有儲存空間。就像int,float等型別一樣,當然,指標有別的變數不具有的特殊用法。1.指標的型別 我們將type 叫做指標的型別,type指的是指標所指向的型別,type是指最後乙個 之前所有的東西,例如 char p,它的type部分就為char char p,它...