其他分享
首页 > 其他分享> > c – 地址算术

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