c – 地址算术
作者:互联网
考虑以下代码:
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:
int values[] = { 0, 1, 2, 3};
int* current = values;
int* end = values + 4;
int sum = 0;
while (current != end)
{
sum += *current;
++current;
}
当然,有比使用原始指针更简单的方法来实现这一点,所以不要编写像这样复杂的代码来做一些更简单的方法.正如其他答案所指出的那样,数组索引由编译器转换为指针算法:values [2]相当于说*(值2)所以在这种情况下,使用更简单的代码循环遍历数组就是你应该做的.
for (int i = 0; i < 4; ++i)
{
sum += values[i];
}
使用指针运算有更高级的原因,因为它实际上可以帮助简化实现;例如,我之前在一个赋值中使用它和reinterpret_cast来创建一个空闲列表内存分配器.
标签:c-3,c,memory-address 来源: https://codeday.me/bug/20190722/1507277.html