指標, 指標的指標, 陣列, 指標陣列, 陣列指標

2021-08-29 22:15:15 字數 2835 閱讀 6541

--------------指標----------------

int a=10;

int *p=&a;

-------------指標的指標-----------

int b=20;

int *p=&b;

int **p2p=&p;

-------------簡單陣列-----------------

int c[10];//整數陣列,含有10個整數元素

也就是說每乙個元素都是整數

--------------指標陣列--------------------

int *p[10];//指標陣列,含有10個指標元素

也就是說每乙個元素都是指標

--------------陣列指標--------------------

int (*p)[10];//陣列指標,這個指標能夠用來指向

含有10個元素的整數陣列

------------函式指標---------------------

int (*p)( ); // 指向函式的指標...這裡宣告了乙個指標p,該指標指向返回值是整型(即函式型別為整型)的函式!

----------------指標函式---------------------------

int *p(int a,float b); //返回值為指標的函式...該函式返回指向整型變數的指標!

即該函式的型別為int *, p和上例不同,他是函式名!上例中是指標!

c/c 中函式指標的含義

函式存放在記憶體的**區域內,他們同樣有位址,我們如何能獲得函式的位址呢?

假如我們有乙個int test(int a)的函式,那麼,他的位址就是函式的名字,這一點如同陣列相同,陣列的名字就是陣列的起始位址。

定義乙個指向函式的指標用如下的形式,以上面的test()為例:

int (*fp)(int a);//這裡就定義了乙個指向函式的指標

函式指標不能絕對不能指向不同型別,或是帶不同形參的函式,在定義函式指標的時候我們很容易犯如下的錯誤。

int *fp(int a);//這裡是錯誤的,因為按照結合性和優先順序來看就是先和()結合,然後變成了乙個返回整形指標的函式了,而不是函式指標,這一點尤其需要注意!

下面我們來看乙個具體的例子:

#include

#include

using

namespace std;

int test(int a);

void

main(int

argc,char* argv)

int test(int a)

typedef定義能夠簡化函式指標的定義,在定義乙個的時候感覺不出來,但定義多了就知道方便了,上面的**改寫成如下的形式:

#include

#include

using

namespace std;

int test(int a);

void

main(int

argc,char* argv)

int test(int a)

函式指標同樣是能夠作為引數傳遞給函式的,下面我們看個例子,仔細閱讀您將會發現他的用處,稍加推理能夠很方便我們進行一些複雜的程式設計工作。

//-------------------該例以上乙個例子作為基礎稍加了修改-----------------------------

#include

#include

using

namespace std;

int test(int);

int test2(int (*ra)(int ,int);

void

main(int

argc,char* argv)

int test(int a)

int test2(int (*ra)(int),int b)//這裡定義了乙個名字為ra的函式指標

利用函式指標,我們能夠構成指標陣列,更明確點的說法是構成指向函式的指標陣列,這麼說可能就容易理解的多了。

#include

#include

using

namespace std;

void t1()

void t2()

void t3()

void

main(int

argc,char* argv)

; cout

<<"比較t1()的記憶體位址和陣列a[0]所儲存的位址是否一致"typedef

void (*fp)();//自定義乙個函式指標型別

fp b=; //利用自定義型別fp把b定義趁乙個指向函式的指標陣列

b[0]();//現在利用指向函式的指標陣列進行下標操作就能夠進行函式的間接呼叫了;

cin.get();

} 仔細看上面的例子可能不用我多說大家也會知道是怎麼一會事情了,最後我們做乙個重點小結,只要記住這一點,對於理解利用函式指標構成陣列進行函式間接呼叫就很容易了!

void* a=;

cout<<"比較t1()的記憶體位址和陣列a[0]所儲存的位址是否一致"《上面的這一小段中的錯誤行,為什麼不能這麼呼叫呢?

前一篇教程我們已說的很清楚了,但是在這裡我們還是複習一下概念,指標陣列元素所儲存的只是個記憶體位址,既然只是個記憶體位址就不可能進行a[0]()這樣位址帶括號的操作,而函式指標不同他是個例外,函式指標只所以這麼叫他就是因為他是指向函式指向記憶體的**區的指標,他被系統授予允許和()括號操作的權利,進行間接的函式呼叫,既然函式指標允許這麼操作,那麼被定義成函式指標的陣列就一定是能夠相同的操作的。

《**:

陣列,指標,指標陣列,陣列指標

指標是在32位系統下佔四個位元組,64位系統下佔八個位元組的一種型別,指標指向的內容可以是常量,變數,函式,結構體,指標本身,陣列,等等.一級指標 一級指標常常在函式傳參時使用,可傳的引數有一維陣列,常量指標,函式指標等等都可以 但我們要注意不要在函式中,通過改變形參的指向來達到改變實參指向的效果,...

指標,陣列指標,指標陣列

1.指標 指標可以看成乙個變數,指標所佔記憶體的大小和處理器的定址空間大小有關,32位處理器指標大小為4個位元組,64位處理指標大小為8個位元組。int p 定義乙個int型別的指標,p就可以看成乙個變數,p的值為0,表示p指向0位址 p也是占用記憶體的,編譯器在棧上為p分配記憶體,儲存p的值0,0...

指標 陣列指標 指標陣列 指向指標的指標

程式中一般通過變數名對變數進行訪問操作,其實質是通過位址進行的。對變數的訪問分為直接訪問和間接訪問,如語句 printf d i 執行的時候,根據變數名 與位址的對應關係,找到i的位址,依次取相應的位元組數中的資料 即i的值 把它輸出。這種按照變數位址訪問變數值的方式成為直接訪問 還可以將變數i的位...