考虑以下代码:
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/