指標和陣列

2021-08-22 04:31:52 字數 3833 閱讀 3719

函式指標

函式指標陣列

指向函式指標陣列的指標

指標陣列,即指標的陣列, 它不是指標,而是乙個存放指標的陣列,陣列的每乙個元素都是指標型別的,例如下面的都是指標陣列:
int *arr[10];//指標陣列,10元素,每個元素都是整型指標型別的

char *arr[4];//指標陣列,4個元素,每個元素都是字元指標型別的

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

由於[ ]的優先順序要比*的優先順序高,所以陣列名先和[ ]結合,所以它的本質是陣列,而它每乙個元素都是指標型別的,所以指標陣列的每乙個元素都佔四個位元組。##陣列指標

int (*p)[10];
解釋:p先和*結合,說明p是乙個指標變數,然後指向的是乙個大小為10個整型的陣列。所以p是乙個指標,指向的是乙個陣列,叫做陣列指標。 ####陣列指標的使用 我們了解了陣列指標的定義,那麼陣列的位址如何來儲存?
int arr[10]=;

int*p1=&arr;

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

這三種哪一種比較合適呢?
我們知道:

整型變數的位址應該放在整型指標裡面去

字元變數的位址應該放在字元指標裡面去 所以陣列變數的位址應該放在陣列指標裡面去

void print(int(*p)[5], int x, int y)//二維陣列的引數(*p)[5]相當於p[5]

//p是指標指向首元素位址,也就是第一行的位址,+i就是第幾行的位址,解引用就是首元素位址,再+j,就是每個元素的位址,再解引用就是每個元素了

printf("\n");

}}int main()

;//二維陣列

print(arr, 3, 5);

return

0;}

執行結果如下:

陣列指標的應用一般都是二維陣列傳參的時候用

上面我們了解了指標陣列和陣列指標,接下來我們辨認一下,下面每個分別是什麼?

int arr[5];

int*parr1[10];

int(*parr2)[10];

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

1.很簡單,是我們經常見到的一維陣列

2.是上面我們了解到的指標陣列

3.也是上面我們知道的陣列指標

那麼第四個到底是什麼呢?我們分析一下:

首先parr3是乙個陣列,因為它和[10]靠的近,陣列有10個元素,再從外面看,他是乙個陣列指標,有5個元素,每個元素是整型,**如下:

通過上面的了解,我們應該進一步知道函式指標,是指向函式的指標,用來存放函式的位址,那麼說明函式也是有位址的,那麼我們怎麼取出函式的位址呢?

可見,取出的確實是這個函式的位址,&函式名是整個函式的位址,那麼函式名難道是首元素的位址嗎?顯然函式我們無法談論首元素,所以在函式取位址的時候&加函式名或是直接函式名取出的都是函式的位址,如下:

了解了函式的位址,那麼我們應該如何將函式的位址儲存起來,這就要用到函式指標了

我們看如下**:

void *p();//p先和()結合,所以是乙個函式

void (*p)();//p先和*結合,所以是乙個指標

第乙個是函式的宣告,而第二個則是函式指標,所以如果我們想把上面的test()這個函式的位址儲存起來,就可以用函式指標void (*p)()來儲存。下面舉出函式指標定義的例子:

int add(int

x, inty)

int main()

解讀兩段有趣的**:

//**一:

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

//**二:

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

**二:①signal是一次函式宣告

②signal函式的引數,第乙個是int,第二個是函式指標,該函式指標指向的函式引數為int,返回型別為void

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

上面解釋了函式指標及其定義,我們知道了函式指標是存放函式位址的,那麼如果我們把函式指標的位址存到乙個陣列中,那這個陣列就叫做函式指標陣列,那麼函式指標陣列應該如何定義呢?下面哪種定義方式是正確的?

int (*parr1[10])();

int *parr2[10]();

int (*)() parr3[10];

答案是parr1,parr1先和[ ]結合,說明parr1是陣列,陣列的內容則是int (*)()型別的函式指標

函式指標陣列的用途:轉移表

實現計算器:

方法一:函式呼叫

一般情況下,我們實現兩個數的加減乘除會像下面這種方式寫:

int add(int a, int b)

intsub(int a, int b)

int mul(int a, int b)

int div(int a, int b)

int main()

printf("ret=%d\n", ret);

}return

0;}

方法二:使用函式指標陣列

int add(int x, int y)

int sub(int x, int y)

int mul(int x, int y)

int div(int x, int y)

void menu()

void calc(int(*pfun)(int, int))//函式指標

//int main()

;//定義乙個函式指標陣列,裡面有5個元素,每個元素分別是乙個函式

do

} while (input);

return

0;}

執行結果如下:

指向函式指標陣列的指標是乙個指標,指標指向乙個陣列,陣列的元素都是函式指標;
那麼指向函式指標陣列的指標又該如何定義呢?

void test(const

char *str)

int main()

指標陣列和陣列指標

有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...

指標陣列和陣列指標

理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...

指標陣列和陣列指標

該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...