所以我正在从Java转换到C ++,并且我仍然无法让我的思维包围指针的工作方式>。希望有些经验丰富的C ++程序员可以帮助我!
在类中,我们使用动态数组创建了堆栈和队列实现。
我的老师使用指针在堆上创建这些数组。
int* data = new int[25];
我不明白你怎么能用“data [top]”将值插入数组?我以为指针只是保存了内存地址?我会问我的老师这是如何工作的,但我正处于紧张状态,直到明天下午她才能回到我身边>。<
Stack::push(int value) {
if(top==size) {
resize();
}
data[top] = value;
top++;
}
答案 0 :(得分:2)
我以为指针只占用了内存地址?
是的,但您可以使用该内存地址执行操作。特别是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那样隐藏得很差。
答案 1 :(得分:0)
查看它的一种方法是data[top]
与*(data + top)
相同。所以你取指针data
,向它添加值top
(乘以int的大小),然后读取或写入该位置。
答案 2 :(得分:-1)
你是对的,指针只保存内存中实际找到数据的点的地址。您正在创建的堆栈只是一个类,它提供了从内存中获取内存并向内存添加内存的特定方法。
另请查看:C++ STL Stack
这应该说明堆栈是如何工作的。