【问题标题】:pointers array stack implementation指针数组栈实现
【发布时间】:2012-09-19 22:14:16
【问题描述】:

所以我正在从 Java 过渡到 C++,但我仍然无法理解指针是如何工作的 >.

在课堂上,我们使用动态数组创建了堆栈和队列实现。

我的老师使用指针在堆上创建这些数组。

int* data = new int[25];

我不明白的是如何使用“data[top]”将值插入到数组中?我以为指针只是保存内存地址?我会问我的老师这是怎么回事,但我时间紧迫,她要到明天下午才能回复我>.

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

【问题讨论】:

    标签: c++ arrays pointers stack implementation


    【解决方案1】:

    我以为指针只是保存了内存地址?

    是的,但是您可以使用该内存地址进行操作。特别是 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 中遇到的空指针异常。

    如果您一直在使用 Java,那么您已经在使用指针。它们在 C++ 中并没有太大的不同,但它们在 C++ 中是直接可见和显式的,而不是像 Java 那样隐藏得很差。

    【讨论】:

    • 感谢您花时间写出如此详尽的解释!非常感谢您的帮助,谢谢!
    • @edA-qamort-ora-y 您应该尝试一下或阅读标准。 5[A] 完全按照我的描述工作。 ideone.com/yw6UJ
    • 我的立场是正确的。 8.3.4-6 的注释明确指出它是可交换的。很奇怪。
    【解决方案2】:

    查看它的一种方式是data[top]*(data + top) 相同。因此,您获取指针 data,将值 top 添加到它(乘以 int 的大小),然后读取或写入该位置。

    【讨论】:

    • ahhhhh 我现在明白了,非常感谢您的快速回复! *(data + top) 是一个很好的表达方式!
    【解决方案3】:

    见:C++ Pointers & Arrays

    你是对的,指针只保存内存中实际找到数据的点的地址。您正在创建的堆栈只是一个类,它提供了一种从数组中获取内存和向数组添加内存的特定方法。

    另请查看:C++ STL Stack

    这应该阐明堆栈是如何工作的。

    【讨论】:

    • 谢谢参考!!
    • 对于谁反对这个,我很好。但是下次告诉我为什么这个答案没有帮助会更有建设性。不仅我可以看到,而且其他人也可以看到为什么这个答案是错误的/无用的,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多