在c 中使用指向陣列的引用

2021-08-02 02:02:22 字數 2333 閱讀 3101

今天在工作中需要在乙個把乙個class內部的某個陣列成員expose(是的,有時候不這樣做只是徒增麻煩)給外面使用,於是自然而然就想應該是返回乙個指向這個陣列的引用會好些。指向陣列的引用這種用法雖然不是很多見,但我還是寫過不少次了,為了方便我常常會用typedef陣列型別來實現,不過今天我突然想到乙個問題,typedef 只是為了縮短敲的**長度和閱讀方便(當然有時候反而造成麻煩,但這不是重點),也就是說必然會有不需要 typedef 的寫法,那麼如果要寫乙個函式讓它返回乙個指向陣列的引用呢?究竟怎麼寫呢?這個問題我還真搞不定,還好google幫了我。

剛開始接觸這個問題的時候確實是有點懵,不過看了c++ primer後發現這個其實很簡單:

intn3[3] = ;

int(&rn3)[3] = n3;// a reference to an array of 3 ints

沒錯,確實是有那麼點怪異!

那麼,typedef 一下也許就好理解多了:

intn3[3] = ;

typedefintint3[3];

int3& rn3 = n3;// a reference to an array of 3 ints

先看看指標是怎麼寫的:

voidgetint3_example1(int* pn3)

不過,誰能保證pn3的大小就一定是3個int呢?再試試看:

voidgetint3_example2(intn3[3])

當然這樣只不過是讓它看起來正確罷了, 實際上這種寫法和第一種沒啥區別!試試看:

intloc[2];// local array of 2 integers

getint3_example2(loc);// no compile error, but access violation!

果然是不行的有木有!

這裡還要注意的是,如果改用typedef,會出現乙個需要注意的問題:

voidgetint3_example3(int3 n3)

;

intn3size  =sizeof(n3);// n3size == 4

intlocsize =sizeof(loc);// locsize == 12, see?

}

所以說,最終還是要用引用才能達到限制大小的目的:

voidgetint3_example4(int(&n3)[3])

或者還是用 typedef 讓它看起來舒服些?

voidgetint3_example5(int3& n3)

好了,終於到重點,先來看看用typedef是怎麼寫的:

int3& getint3_example6()

;

returnn3;

}

很好,那麼如果說不用typedef呢?

好吧,我不得不google之,按照這個部落格的解釋,原來又是乙個怪異的寫法:

int(&getint3_example7()) [3]

;

returnn3;

}

真是會讓人暈倒啊有木有!

在c 中使用指向陣列的引用

剛開始接觸這個問題的時候確實是有點懵,不過看了c primer後發現這個其實很簡單 intn3 3 int rn3 3 n3 a reference to an array of 3 ints 沒錯,確實是有那麼點怪異!那麼,typedef 一下也許就好理解多了 intn3 3 typedefint...

在DP中使用 滾動陣列

舉個簡單的例子 int d new int 100 d 0 1 d 1 1 for int i 2 i 100 i d i d i 1 d i 2 system.out.printf d d 99 上面這個迴圈d i 只需要解集中的前2個解d i 1 和d i 2 為了節約空間用滾動陣列的方法 in...

在NumPy中使用動態陣列

本文 numpy的ndarray陣列物件不能像list一樣動態地改變其大小,在做資料採集時很不方便。本文介紹如何通過np.frombuffer 實現動態陣列。python的列表物件實際上是乙個動態指標陣列。當列表中沒有空間儲存新的元素時,列表會動態地改變其大小,以容納新的元素。每次改變大小時,它都會...