簡單理解—指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列的指標
阿新 • • 發佈:2018-11-10
簡單理解—指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列的指標
指標陣列
指標陣列,顧名思義是”指標的陣列”,首先這個變數是一個陣列,其次,”指標”修飾這個陣列,意思是說這個陣列的所有元素都是指標型別,在32位系統中,指標佔四個位元組。
舉個例子:
char *str[4] = {"hello", "world", "work", "hard"};
//str就是我定義的一個指標陣列,它有四個元素,每個元素是一個char *型別的指標,這些指標存放著其對應字串的首地址
為什麼這樣定義呢?
這裡就需要對優先順序
有一定的瞭解,因為 [] 的優先順序高於 * ,所以 str 先與 [] 結合,表示這是一個數組變數,有四個元素。之後我們可以將 str[4] 去掉,就剩下了 char * ,表示這個陣列中存放的是char * 型別的指標
陣列指標
陣列指標,顧名思義是”陣列的指標”,首先這個變數是一個指標,其次,”陣列”修飾這個指標,意思是說這個指標存放著一個數組的首地址,或者說這個指標指向一個數組的首地址。
舉個例子:
char *str[4] = {"hello", "world", "work", "hard"};
char *(*pstr)[4] = str;
//pstr就是我定義的一個數組指標,它存放著陣列str的地址
//str陣列有四個元素,每個元素是一個char *型別的指標,這些指標存放著其對應字串的首地址
為什麼這樣定義呢?
因為 [] 的優先順序高於 * ,所以需要加上()來保證 pstr 先與 * 結合,表示這是一個指標變數,它存放著陣列str的地址。之後我們可以將 * pstr 去掉,就剩下了 char * [4] ,表示這個指標指向的是一個數組,這個數組裡面存放了四個char * 型別的指標
函式指標
函式指標,顧名思義是”函式的指標”,也就是指向函式地址的一個指標變數
舉個例子:
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1;
int b = 2;
int (*pfun)(int,int) = Add(a, b);
//Add是一個簡單的加法函式
//pfun就是我定義的一個函式指標,它存放著函式Add的地址
printf("%d\n", pfun);
return 0;
}
為什麼這樣定義呢?
同樣的,因為 () 的優先順序高於 * ,所以需要加上()來保證 pfun 先與 * 結合,表示這是一個指標變數,它存放著函式Add的地址。之後我們可以將 * pfun 去掉,就剩下了 int () ,表示這個指標指向的是一個函式,這個函式有兩個int型引數,它的返回值為int型別。
函式指標陣列
函式指標,顧名思義是”函式指標的陣列”,也就是一個用來存放函式指標的陣列
函式指標的用途:轉移表
舉個例子:(計算器)
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
if (y == 0)
{
return 'F';
}
else
{
return x / y;
}
}
int main()
{
int a = 0;
int b = 0;
int input = 1;
char ret = 0;
int(*p[5])(int a, int b) = { 0, Add, Sub, Mul, Div };
//
//轉移表
//p就是我定義的一個函式指標陣列,它有五個元素,每個元素是一個函式指標,這些指標存放著其對應函式的地址
while (input)
{
printf("**********************************\n");
printf("***** 1.Add 2.Sub *****\n");
printf("***** 3.Mul 4.Div *****\n");
printf("***** 0.Quit *****\n");
printf("**********************************\n");
printf("\n請選擇:");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
begin:
printf("\n請輸入運算元:");
scanf("%d %d", &a, &b);
ret = p[input](a, b);
if (ret == 'F')
{
printf("\n輸入有誤,請重新輸入\n");
goto begin;
}
else
{
printf("\nret = %d\n\n", ret);
}
}
else if (input == 0)
{
printf("\n退出\n\n");
}
else
{
printf("\n選擇錯誤\n\n");
}
}
return 0;
}
指向函式指標陣列的指標
如何定義?
void test(int x)
{
printf("hehe\n");
}
int main()
{
//函式指標pfun
void(*pfun)(int) = test;
//函式指標陣列pfunarr
void(*pfunarr[5])(int);
pfunarr[0] = test;
//指向函式指標陣列pfunarr的指標ppfunarr
void(*(*ppfunarr)[10])(int) = &pfunarr;
return 0;
}