1.數組的四種訪問方式
定義數組 a[]; 指針 *p 指向數組a;
(1) 利用數組的下表進行訪問 a[i];
(2) 數組名+地址的偏移量i *(a+i)
(3) 利用指針 p 進行下表訪問 p[i]
(4) 指針p + 地址的偏移量i *(p+i)
一維數組數組名:相當於一個單指針
2.
數組指針(指針) 指針數組(數組)
函數指針(指針) 指針函數(函數) -------->只看後邊兩個字就能夠區分是指針還是數組或函數
_____________________________________________________________________________
數組指針:(指向數組全部地址的指針)
int a[3]={2,3,4}
int *p = a; // 指向數組的指針
int *p1 = &a[0] // 指向數組首元素的指針
int (*p2)[3] = &a; // 數組指針指向數組的全部地址
3 - > 所指向數組中數據的個數
&a 表示數組從開始到結束全部的地址空間
_____________________________________________________________________________
指針數組:(保存多個地址的數組)
int a=10;
int b=20;
int c=30;
int *pa[3]={&a,&b,&c}; //保存的是 int* (地址)
_____________________________________________________________________________
函數數指針 (指向函數的指針) // 函數名代表函數的入口地址
三個要素: 與所指函數 返回值類型相同,參數類型相同,參數個數相同。
int Max(int a,int b){ }
int (*pfun)(int,int);
main()
{
Max(12,13);
pfun=&Max; ----> pfun=Max;
(*pfun)(12,13); ----> pfun(12,13);
}
_____________________________________________________________________________
指針函數 (返回類型為指針類型稱為指針函數)
定義格式: 返回類型標識符 *函數名稱(形式參數表)
{ 函數體 }
_____________________________________________________________________________
3 如何區分:
數組指針:
定義 int (*p)[n]; ()優先級高,首先說明p是一個指針,指向一個整型的一維數組,
這個一維數組的長度是n。
指針數組:
定義 int *p[n]; []優先級高,先與p結合成為一個數組,再由int*說明這是一個整型
指針數組,它有n個指針類型的 數組元素。
函數指針:
定義 int (*pfun)(int,int); *pfun在括號內,首先形成指針,出括號後仍為括號,
指向一個返回值為整形的函數,並且此函數有 兩個整形作為形參。
指針函數:
定義 int *fun(); 相當於 int* fun(); 返回值為一個整形的指針。
_____________________________________________________________________________
4.復雜指針:
右左法則: 從未定義的標識符開始閱讀,然後先往右看,再往左看。每次遇到圓括號時,掉轉方向。
一旦解析完圓括號裡面所有的東西,就跳出圓括號。重復這個過程直到解析完畢。
int (*fun)(int *p);
首先找到那個未定義的標識符,就是fun,它的外面有一對圓括號,而且左邊是一個*號,這說明
fun是一個指針,然後跳出這個圓括號,先看右邊,也是一個圓括號,這說明(*func)是一個函數,
而fun是一個指向這類函數的指針,就是一個函數指針,這類函數具有int*類型的形參,返回值類型是 int。
int (*fun[5])(int *p) ;
fun右邊是一個[ ],說明fun是一個具有5個元素的數組,fun的左邊有一個*,說明fun的元素是指針,
要注意這裡的*不是修飾 fun的,而是修飾fun[5]的,原因是[]運算符優先級比*高,fun先跟[]結合,
因此*修飾的是func[5]。跳出這個括號,看右邊,也是一對圓括號,說明func數組的元素是函數類型的
指針,它所指向的函數具有int*類型的形參,返回值類型為int。