考虑以下代码:

int main() {
    long long * x = new long long [10]; // array of long long
    long a = (long) x;  // address of first element
    long b = (long) (x+1); //address of second element
    long c = b - a ;  // first difference
    long d = (long) ((x+1) - x);  // second difference
    std::cout << c << std::endl ;
    std::cout << d << std::endl ;
    return 0;
}

程序输出先是 8 ,然后是 1 。
我对指针有了一些了解,以及如何使用它们。
我得出的结论是,将 +1 添加到原始指针值将使其所指对象的大小增加。这个功能对我来说很陌生。

所以我的问题是为什么指针类型的行为是这样的?
这种行为有什么用?

最佳答案

指针运算允许您编写处理数组的代码。考虑对整数数组求和:

int values[] = { 0, 1, 2, 3};
int* current = values;
int* end = values + 4;
int sum = 0;
while (current != end)
{
    sum += *current;
    ++current;
}

当然,有比使用原始指针更简单的方法来实现这一点,所以永远不要写这么复杂的代码来做一些比其他方式更简单的事情。正如其他答案所指出的那样,数组索引被编译器转换为指针算术:values[2] 相当于说 *(values + 2) 所以在这种情况下,使用更简单的代码循环数组是你应该做的。
for (int i = 0; i < 4; ++i)
{
    sum += values[i];
}

使用指针算法有更高级的理由,因为它实际上可以帮助简化实现;例如,我之前在分配中使用它和 reinterpret_cast 来创建一个空闲列表内存分配器。

关于c++ - 地址运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22272920/

10-15 12:23