指向指標的指標

2021-06-22 02:27:39 字數 1216 閱讀 3865

這幾天我下意識地琢磨到底**錯了,今天猛然明白了他的想法,其實這個技術點我早已掌握,只是當時對問題未深入思考,把握得較模糊,一時沒洞察他的思路,疏忽了。

問題大概是這樣的:

寫乙個函式,將乙個二維陣列作乙個變換。

void rotate( &array)

//開闢備份空間

//根據變換要求將元素一一賦值

//……

因為這個方法並不太好,所以沒寫完就一半放那,話題轉移到矩陣變換上去了。

然後面試官反覆問了我:這裡的引數這樣寫有沒有問題?

他的意思應該是,開闢備份空間,將原資料根據變換要求一一賦值給備份空間中的元素,然後將這個備份空間的指標賦值給原陣列的頭指標。

這樣,就會因為指標修改失敗而無法返回變換後的矩陣。

其實這裡實現的途徑不止一種,假如我是先將原資料備份在備份空間,然後用備份空間的值,一一賦值給原陣列元素,相當於直接操作了原陣列空間,這樣就不會有問題。

分割線指向指標的指標作為引數的意義:

我們會發現,微軟的很多api函式,引數都是指向指標的指標。為什麼搞這麼複雜呢?

指標的指標作引數有它存在的道理,這種情況一般發生在函式需要在處理過程中用new新開闢記憶體空間,然後要返回指向新空間的指標。這時候,傳遞進來的指標,其實是需要被改變的。假如直接將指標傳遞進來,你最終會發現,指標是無法被改變的,因為就像傳遞普通變數型別的形參時一樣,形參最終無法被改變,必須傳變數的指標才行。

指標也是一樣的道理,假如指標需要被改變,那就應該傳遞指標的指標。

就這麼簡單。

乙個例子:

使用gdi+作圖時,有時候你定義了乙個image *image,image是image型別的指標。

然後你希望在某個函式裡,給image賦值。比如init( image* image)裡,你寫了image = image->fromfile(); 然後等到退出init()後,你卻發現image根本沒被賦值!

這裡假如改為init( image **image),傳遞指標的指標,就沒問題了。

2014.5.20補充:

今天又和面試官重提了此問題,倒沒有我想的那麼複雜,不過二維陣列作引數還是需要注意下的。

申明部分的形參,不能用&array這種形式,直接用rotate(int a[10][10])這種就好了。

傳遞實參時,直接傳陣列名,即rotate(a);

這時實際上傳遞的也就是陣列的頭指標,在裡頭對值進行操作,是可以保留到函式退出以後的。

指向指標的指標

理解二級指標,關鍵是理解指標的儲存方式和意義。這裡以指向int型指標的指標為例,梳理一下二級指標在記憶體分配中 的奧妙.include using namespace std int main int p a int point p cout a a endl p p endl p p endl p...

指向指標的指標

一 回顧指標概念 讓我們先回顧一下指標的概念吧!當我們程式如下申明變數 short int i char a short int pi 程式會在記憶體某位址空間上為各變數開闢空間,如下圖所示。圖中所示中可看出 i 變數在記憶體位址5的位置,佔兩個位元組。a變數在記憶體位址7的位置,佔乙個位元組。接下...

指向指標的指標

如果乙個指標變數存放的又是另乙個指標變數的位址,則稱這個變數為指向指標的指標變數或指向指標的指標。定義方式 資料型別 變數名 int a 10 位址為 a int p a 指標位址為 p 如果是p就是a的位址 int p1 p 指標位址為 p1 如果是 p1就是 p 要注意這幾個位址的區別,不能混淆...