昨天在參加筆試時考了幾道指標函式,函式指標類的題,我感覺回答得有點亂,說明自己對這方面的知識掌握得不夠,今天特意找找這方面的知識,希望自己可以學懂。
指標,指標陣列,陣列指標,函式指標
基本的形式,我們從這裡起步!
--------------指標----------------
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 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...