簡體   English   中英

指針數組堆棧實現

[英]pointers array stack implementation

因此,我正在從Java過渡到C ++,但仍然無法設法使我對指針的工作方式有所了解>。<希望你們中一些經驗豐富的C ++程序員能夠為我提供幫助!

在課堂上,我們使用動態數組創建了堆棧和隊列實現。

我的老師使用指針在堆上創建這些數組。

int* data = new int[25];

我不明白的是如何使用“ data [top]”將值插入數組? 我以為指針只是保存內存地址? 我會問老師這是怎么工作的,但我正處於時間緊迫的狀態,她要等到明天下午才能回到我的身邊。

Stack::push(int value) {
    if(top==size) {
        resize();
    }
    data[top] = value;
    top++;
}

我以為指針只是保存內存地址?

是的,但是您可以使用該內存地址進行操作。 特別是C ++允許使用一種稱為“指針算術”的方法,它允許您使用內存地址來獲取相對於您已經擁有該地址的內存而位於的其他內存的地址。 例如,如果您有內存地址,則可以獲取緊隨其后的內存地址。

(正方形是內存位置)

☐
☐ 
☐  ← I have the address of this memory in variable A
☐  ← I would like to get the address of this memory location and to store it in X
☐
☐
☐


int *A = ...;
int *X = A + 1; // compute the address of the next memory location

因此,數組是一系列存儲位置。 要訪問數組的任何元素,您只需獲取您擁有的地址,計算要訪問的元素的地址,然后使用該新地址。

int *A = new int[10];
int *X = A + 5; // get the address of the memory five locations past where A points to
*X = 999;

您不必將計算出的地址存儲在變量中:

int *A = new int[10];
*(A+5) = 999;

C ++提供了語法*(A+5)的簡寫,這是數組索引運算符:

int *A = new int[10];
A[5] = 999;

有趣的是,數組索引運算符實際上只是該*(A+5)表達式的簡寫。 因為您可以翻轉操作數並執行*(5+A) ,所以可以對數組索引運算符執行相同的操作:

5[A] = 999;

但是,您不應該這樣做,因為它不是很可讀。


關於指針要了解的另一件事:Java有指針。 當你做

String s = new String();

在Java中, s是一個指針。 Java只是在試圖掩蓋這一事實的同時,它需要比C ++更大程度地使用指針。 Java沒有指針算法,也不必像在C ++中那樣手動取消引用Java中的指針。 但是請考慮:

List<String> l = new List<String>();
List<String> m = l; // Do I have two lists, l and m, that can be modified independently? Or do I have two entities, l and m, that both refer to the same List object?

並記住您在Java中獲得的那些Null Pointer異常。

如果您一直在使用Java,那么您已經在使用指針。 它們在C ++中並沒有真正的不同,但是它們在C ++中是直接可見和顯式的,而不是像Java那樣隱藏得很差。

一種查看方式是data[top]*(data + top) 因此,您獲取指針data ,將值top添加到上面(乘以int的大小),然后讀取或寫入該位置。

請參閱: C ++指針和數組

沒錯,指針僅保留指向內存中實際找到數據的點的地址。 您正在創建的堆棧只是一個類,它提供了一種從陣列獲取內存以及向陣列添加內存的特定方法。

還要簽出: C ++ STL堆棧

那應該闡明棧是如何工作的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM