高階指標與陣列 函式指標,函式指標陣列等

2021-08-19 14:04:14 字數 3326 閱讀 6901

下面與大家一起討論一下高階版的指標與陣列,是建立在大家的一級指標和一維陣列的基礎上的。

存放指標的陣列。

因為 [ ] 操作符的優先性要高於 * 操作符,所以下面的均為指標陣列:

int *arr1[10]; 表示指標陣列,強調的是陣列。陣列有十個元素,是指向int型別資料的指標。

char *arr2[4]; 表示指標陣列,強調的是陣列。陣列有4個元素,是指向char型別資料的指標。

指向陣列的指標,(由於陣列可以被取位址)

因為()操作符的結合性高於 * 操作符,所以以下為指標的定義。例:

(1)

int arr[10]=;

int(* p)[10]=&arr;

意思是* p先是指標,再指向陣列,這個陣列裡面有10個元素,每個元素是int整型。

(2)

int (*p2)[10];

是乙個指 針,它指向乙個包含 10 個 int 型別資料的陣列,即陣列指標.

(拓展)多維陣列和多級指標

這裡是一維陣列和一級指標的高階版本,在我們搞明白了這裡以後,以後的按照概念推出來即可。

(1)二維陣列:我們可以將其想象成乙個矩陣,如下圖:

但我們也需要明白實質:二維陣列並不是**樣的,而是線性的。按照首位址開始,然後依次排列在記憶體中。如:

我們可以用a[ i ][ j ]來訪問該處的資料,也可以用指標來訪問,((a+i)+j)。

(2)二級指標:char **p;

二級指標歸根到底還是乙個指標,它就是儲存一級指標位址的指標。

那麼我們應該怎麼使用p呢?下面就是使用步驟:

第一步:根據 p 這個變數,取出它裡面存的位址。

第二步:找到這個位址所在的記憶體。

第三步:用鑰匙開啟這塊記憶體,取出它裡面的位址,*p 的值。

第四步:找到第二次取出的這個位址。

第五步:用鑰匙開啟這塊記憶體,取出它裡面的內容,這就是我們真正的資料,**p 的值。

我們在應用陣列和指標時,傳參到函式是不可避免的一步,那麼怎麼才算是正確的傳參呢?

在c 語言中,當一維陣列作為函式引數的時候,編譯器總是把它解析成乙個指向其首元 素首位址的指標。

(1)例如:(一維陣列)

int arr[10]=;

int*arr2[20]=;

tsst(arr);

test2(arr2);

則,傳參的種類可以是

void test(int   arr)

void test(int arr[10])

void test(int *arr)

void test2(int *arr2[20])

void test2(int **arr2)

(2)例如:(二維陣列)

int arr[3][5]=;

test(arr);

則,傳參的種類可以是

void test(int   arr[3][5])

void test(int arr[5])

(3)例如:(一級指標)

一級指標用一級指標接收。

這個詞的完整表述應該是指向函式的指標,那麼我們就可以知道,這個概念的實質是乙個指標。

如: a. char * fun1(char * p1,char * p2);

b .char * fun2(char p1,char * p2);

c. char * (fun3)(char p1,char * p2);

a 中,fun1 是函式名,p1,p2 是引數,其型別為 char 型,函式的返回值為 char 型別。

b中,與a類似,不過該函式的返回值為char **型別。

c中,這裡fun3先和()操作符結合,所以fun3為指標變數,指向乙個函式。這個函式有兩個指標型別的引數,函式的返回值也是乙個指標。其實也就是

char * ()(char p1,char * p2) fun3;

1.void test()

int main()

不要著急,我們可以一步步分析:

第一步:void(*) (),可以明白這是乙個函式指標型別。這個函式沒有引數,沒有返回值。 第二步:(void(*) ())0,這是將 0 強制轉換為函式指標型別,0 是乙個位址,也就是說一

個函式存在首位址為 0 的一段區域內。

第三步:(*(void(*) ())0),這是取 0 位址開始的一段記憶體裡面的內容,其內容就是儲存 在首位址為 0 的一段區域內的函式。

第四步:(*(void(*) ())0)(),這是函式呼叫。

(2)void (*signal(int,void(*)(int)))(int)

同樣,可以先將其轉化一下,表示的是void (*)(int) signal(int,void(*)(int)),返回型別是函式指標void(*)。引數為(int)。則:

(1)signal是乙個函式

(2)signa函式的引數有兩個,第乙個為int型別,第二個為函式指標型別,該指標指向的函式有乙個整型引數,返回型別為void。

(3)signal函式的返回型別為乙個函式指標型別,該指標指向的函式有乙個整型引數,返回型別為void。

這裡我們研究一下函式指標陣列,顧名思義,就是存放函式指標的陣列。(因為陣列可以存放各種資料型別,除了函式)定義如下:

char *  (*pf[3])(char *  p);
我們可以分析一下這個表示式的組成:它是乙個陣列,陣列名為 pf,陣列內儲存了 3 個指向函式的 指標。這些指標指向一些返回值型別為指向字元的指標、引數為乙個指向字元的指標的函 數。

看到這個,大家的小心臟是不是不爭氣的停了一下?不要著急,經歷了那麼多洗禮,我們應該要有免疫,也應該懂得一點套路:先看被修飾的成分,「指標」。哦,無非就是個指標嘛!不過這個指標這個指標指向乙個陣列,這個陣列裡面存的都是指向函式的指標。也就這樣吧。

定義如下:

char *(*(*pfun)[5])(char *p);

c指標陣列與陣列指標與指標函式與函式指標筆記

include include typedef struct t ooxx t ooxx,pt ooxx 測試陣列指標 void test ooxx arrayp t ooxx p int num 測試指標陣列 void test ooxx parray t ooxx p,int num 測試函式指...

指標陣列,陣列指標,指標函式,函式指標

int p 4 指標陣列。是個有4個元素的陣列,每個元素的是指向整型的指標。int p 4 陣列指標。它是乙個指標,指向有4個整型元素的陣列。int func void 指標函式。無參函式,返回整型指標。int func void 表示函式指標,可以指向無參,且返回值為整型指標的函式。右左規則 因為...

陣列指標,指標陣列,函式指標,指標函式

陣列指標,指標陣列,函式指標,指標函式 指標 變數,存放變數的位址。例 int ptr,ptr是乙個指向整形變數的指標 陣列 例 int a 10 定義了乙個具有10個元素的一維陣列,其中陣列的每個元素是乙個int型別。陣列指標 陣列首元素位址的指標,即是指向陣列的指標。例 int ptr 10 c...