指標與函式

2021-05-09 17:47:43 字數 4095 閱讀 5385

昨天在參加筆試時考了幾道指標函式,函式指標類的題,我感覺回答得有點亂,說明自己對這方面的知識掌握得不夠,今天特意找找這方面的知識,希望自己可以學懂。

指標,指標陣列,陣列指標,函式指標

基本的形式,我們從這裡起步!

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

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個元素的整數陣列

注:在c語言中[ ]的優先順序為1,*的優先順序為2,這樣[ ]的優先順序比*的要高,這樣就是先p[10]結合宣告乙個陣列名為p的陣列,後再與*結合後為*p[10],其陣列元數為 int型別指標,這樣就可以知道int *p[10]就定義了乙個指標陣列,用來存放unsigned char型別位址,編譯器為該一維陣列分配了10個sizeof(int

*)的空間.;

對於int (*p)[10],( )的優先順序[ ]相等,這樣就是從左到右結合.就是先(*p)結合宣告乙個p的指標,後再與[10]結合宣告乙個陣列指標後(*p)[10],其p指向10個陣列元素,這樣就可以知道int (*p)[10]就定義了乙個陣列指標,編譯器為p分配了乙個指標空間

,因為其不是乙個陣列只是指向陣列元素,所以編譯器不為其分得乙個陣列空間。

################################

#                              #

#      進一步提高知識          #

#                              #

################################

陣列,陣列的指標,指標的陣列,概念太多了。我接受概念一多的

時候,我就想把這些複雜的東西簡單一下。因為我太懶了,概念簡化

一下,記住更容易一點。所以我們這裡要認識一下上面這些概念本質。

這樣可以簡化概念,減少記憶的難度。

先看一段程式。

#include

#include

using namespace std;

int main()

;int *p=&vint;

int **p2p=&p;

int *parr[2]=;

int (*p2arr)[2]=&arr;

cout<<"declaration [int vint=10] type=="}執行的結果如下:(我在前面加了行號#xx)

#01 declaration [int vint=10] type==int

#02 declaration [arr[2]=] type==int *

#03 declaration [int *p=&vint] type==int *

#04 declaration [int **p2p=&p] type==int * *

#05 declaration [int *parr[2]=] type==int **

#06 declaration [int (*p2arr)[2]=&arr] type==int (*)[2]

現在我們來分析一下結果。因為我們已經具有了第一部分的基本知識,我們現在

可以很明確區別出來我們宣告的型別。這裡主要有兩個很重要的部分,我們不過

是就事講事情,編譯器是如何實現的原理不在這裡討論之列。

--------#02:陣列------------

現在看#02,想到了什麼沒有呀?在編譯器看來陣列只是相對應型別的指標型別。

當我們把陣列傳遞給函式作為引數的時候,傳遞的是指標,所以我們可以利用

引數來修改陣列元素。這個轉化是編譯器自動完成的。

void f(int);

int a[2]=;

f(a);//這行等價於編譯器完成的函式轉化f(int *p)

也就是說這裡編譯器自動完成了int型別到int *的轉化,

注意是編譯器完成的,也可以說是語言本身實現的,我們

對此只有接受的份了。

-------#05:指標陣列---------------

指標陣列的編譯器內部表示也是對應型別的指標。

------#06:陣列指標----------------

陣列指標的編譯器內部表示就是有一點特別了。

編譯器(或者說是語言本身)有陣列指標這個內部表示。

由於c++語言的型別嚴格檢查的語言(當然還有一些是存在隱式型別轉化的)

所以我們下面的寫法是不能編譯通過的。

;//注意是3個元素陣列

int (*p2arr)[2]=&arr;//注意是指向2個元素陣列的指標

file://---------編譯不能通過--------------

}################################

#                              #

#      初步小結                #

#                              #

################################

通過上面兩個小節的內容,大家應該基本明白了,

陣列,指標,指標陣列,陣列指標到底是怎麼一回事情了吧。

-----------補充開始-----------------------

關於陣列和指標的轉化,以及我們使用指標(++,--)等來運算元組,

是基於陣列在記憶體中是連續分布的。

但是我們使用「迭代器」的時候,情況是不一樣的。

這個問題本文不討論。

-----------補充結束---------------------

int (*a)(int);

int (*p())[10];

第一種情況為陣列裡面是函式指標的情況,因為(int (*)(int))是乙個強制轉換方式, 將裡面的a這個陣列轉換成了乙個函式指標的陣列, 並且該函式是乙個帶乙個整型變數,並且返回乙個整型的函式.

第二種情況為函式返回的為指向乙個一維陣列的指標的情況. 因為(int (*)[10])將其強制轉換成了乙個指標,而該指標則是乙個指向一維陣列的指標.

分別舉兩個例子進行說明:

對於第一種函式指標陣列的情況,如下:

#include

int fun(int a)

int main()

p[10]為乙個指標陣列,而該指標陣列裡面的值為函式指標型別.讓p[0]指向fun()函式.然後再進行呼叫,就可以呼叫到fun()這個函式了.

對於第二種返回陣列指標的函式,如下:

#include

#include

int (*p())[10]

for (i = 0; i < 10; i++)

*(*m+i) = i+1;

return m;

}int main()

其實int (*m)[10];這種方式一般是用來指向乙個二維陣列的,例如

int b[4][10];

int (*m)[10] = b;

其指向二維陣列中的一維.

使用*(*(m+i)+j);這種方式就可以訪問b[i][j]這個元素.而上面的是使用這種方式來指向乙個一維陣列,同樣也是一樣的.只是前面的*(m+i)中的i變為0了.因為只有一維大小.即

int a[10];

int (*m)[10] = &a;

就使得m指向了a這個陣列了.而平時所用的int *p = a;只是讓p指向了a的第乙個元素.比前面的指向一維陣列的指標少了一維.前面的m+1跳過的是10個整型的長度.而後面的p+1則只是跳過了1個整型的長度.

函式指標與指標函式

指標函式 指標函式是指函式的返回值型別是乙個指標型別,即本質是乙個函式。我們知道函式都有返回型別 如果不返回值,則為無值型 只不過指標函式返回型別是某一型別的指標。其定義格式如下所示 返回型別識別符號 返回名稱 形式參數列 返回型別可以是任何基本型別和復合型別。返回指標的函式的用途十分廣泛。事實上,...

函式指標與指標函式

函式指標 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式 的首位址,指向函式 首位址的指標變數稱為函式指標。1 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...

函式指標與指標函式

函式指標 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式 的首位址,指向函式 首位址的指標變數稱為函式指標。1 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...