下面與大家一起討論一下高階版的指標與陣列,是建立在大家的一級指標和一維陣列的基礎上的。
存放指標的陣列。
因為 [ ] 操作符的優先性要高於 * 操作符,所以下面的均為指標陣列:
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...