c/c++之指針
一:相關概念
1.指針數組:int *p[6] 是數組,是一個存放指針的數組,也就是裏面存放的是地址。
2.數組指針:int (*p)[6] 是指針,該指針指向一個數組。
3.函數指針:int* (*fun)(int *p1,int *p2) 是指針,該指針指向一個函數,函數的返回值是一個地址。
4.函數指針數組:int *(*fun[6])(int *p1,int *p2) 是數組,存放的是函數指針的數組。
5.指向函數指針數組的指針
看出來點規律沒???可以這樣讀 指針的數組,加一個的;數組的指針;函數的指針;看 的 後面的定語是什麽,這個變量表示的就是什麽。
二:解釋
1.指針數組
首先這是一個數組, 而數組中存的是指針,強調的是數組,數組,數組。還有數組占多少字節由數組本身決定。它是“儲存指針的數組”的簡稱。
這裏需要明白一個符號之間的優先級的問題,“[ ]”
比“ * ”
的優先級要高,p1會先和“[ ]”
結合,構成一個數組,數組名為p,int *
修飾的是數組的內容,
即數組的元素。那麽int *p[4];
int
數據類型的指針,即指針數組。
int *p[6];
cout<<sizeof(p[0])<<endl;//8
cout<<sizeof(p)<<endl;//48
一個指針在32位的機上占四個節,在64位的機上占8個字節。
2:數組指針
那現在清楚了,它是一個指針,它指向數組,強調的是指針,指針,指針,這個指針是指向一個數組的,int (*p)[4];
就更好解釋了,
在這兒()
的優先級比[]
的優先級高,那麽 p 先和*
結合,說明 p 是一個指針,p是指針變量名。int
修飾數組的內容,即數組的每個元素。
數組在這裏沒有名字,是一個匿名數組,p 是一個指針,它指向一個包含4個int
int (*p)[6];
cout<<sizeof((*p)[1])<<endl;//4輸出的數組中的第二個元素所占的字節大小,因為每個數據類型都為int型,所以占4個字節
cout<<sizeof(p)<<endl;//8輸出的時p所占的字節大小,p為指針,所以p占八個字節。
等同於 int (*)[6] p;
3.函數指針
與它 int *(*)(int *p1,int *p2) fun;等價。
這是一個函數指針,fun 是一個指針變量名,指向一個函數,這個函數有兩個參數,分別為整型指針 p1 和字符這個指針 p2 ,函數的返回類型是整型指針類型。
4.函數指針數組
int* (*fun[6])(int* p1, int* p2) ;
它是一個數組,數組名是 fun 。數組中存了6個指向函數的指針。我把它變換一下 你在來看int* (*)(int* p1, int* p2) fun[6] ;
這6個指向函數的指針指向 。重點是要明白這時一個數組。
5.函數指針數組
int* (*(*)[6])(int* p1,int* p2) fun
聽我解釋:fun 首先是一個指針,這個指針指向一個包含了6個元素的數組;這個數組裏面存的是指向函數的指針;
這些指針指向一些返回值類型為指向整型的指針、參數為一個指向整數的指針的函數.
最後附上一個代碼,在網上看別人的;
(*(void(*)())0)();
//調用0地址處的函數,該函數為沒有參數,返回類型為void的函數
//該代碼是把0強轉成函數指針,然後再解引用找到函數再調用
void(*signal(int, void(*)(int)))(int);
//是一個函數聲明,signal是一個函數,
//參數為int類型和函數指針類型,返回值為函數指針類型
c/c++之指針