1. 程式人生 > >c/c++之指針

c/c++之指針

指針 指向 end 結合 字符 數組名 需要 現在 上一個

一:相關概念

1.指針數組:int *p[6]                 數組,是一個存放指針的數組,也就是裏面存放的是地址。

2.數組指針:int (*p)[6]                  是指針,該指針指向一個數組。

3.函數指針:int* (*fun)(int *p1,int *p2)              是指針,該指針指向一個函數,函數的返回值是一個地址。

4.函數指針數組:int *(*fun[6])(int *p1,int *p2)       是數組,存放的是函數指針的數組。

5.指向函數指針數組的指針

:int *(*(*fun)[6])(int *p1,int *p2)    是指針,指針指向一個數組,數組的元素為函數指針。

看出來點規律沒???可以這樣讀 指針數組,加一個;數組指針;函數指針;看 後面的定語是什麽,這個變量表示的就是什麽。

二:解釋

1.指針數組

首先這是一個數組, 而數組中存的是指針,強調的是數組,數組,數組。還有數組占多少字節由數組本身決定。它是“儲存指針的數組”的簡稱。

這裏需要明白一個符號之間的優先級的問題,“[ ]”“ * ”的優先級要高,p1會先和“[ ]”結合,構成一個數組,數組名為p,int *修飾的是數組的內容,

即數組的元素。那麽int *p[4];

就清楚了,它是一個數組,存了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++之指針