内存单元和c ++指针

时间:2017-04-06 06:33:39

标签: c++ pointers memory memory-management

我目前想知道关于c ++指针的一些事情。例如,指针返回变量的内存地址。因此,如果我们说,我们想要一个整数的内存地址,我们通常有32位的长度。

当我们说一个存储单元的大小是1字节时,我需要4个单元用于一个整数(4x8位= 32位)。所以,假设我有一个指针地址,如:selenium.common.exceptions.WebDriverException: Message: unknown error: Cannot read property 'style' of undefined ,用于一个整数(0x613c20)。

当这个地址指向整个存储器中的4个单元中的一个时,为什么当我将单元增加+1时,我得到另一个值?我会得到相同的值,因为我仍然在4个单元格中的一个?

非常感谢。

编辑:

我想我在第一篇文章中并不那么清楚: 我并不是说我将指针增加了int a = 10;;

我在调试器内部并通过添加+1来操纵整数的内存地址,如:

0x1 - > 0X2。

这意味着:

pointer++

当整数大小为4字节长时,为什么我不能在这里获得10?

2 个答案:

答案 0 :(得分:1)

当您递增/递减指针时,内存地址会增加/减少"通过对象类型的长度,指针被声明为(例如,如果它是相同类型的对象序列,它将指向相同类型的下一个/上一个对象)

一个小例子:

#include <iostream>
using std::cout;
using std::endl;

int main()
{
    int i = 5;
    int* p_i = &i;

    short c = 'a';
    short* p_c = &c;

    cout << "\npointer to int (4 bytes)\n";

    cout << "adress: " << p_i << "   ";
    cout << "value: " << *p_i << endl;
    ++p_i;
    cout << "adress: " << p_i << "   ";
    cout << "value: " << *p_i << endl;
    ++p_i;
    cout << "adress: " << p_i << "   ";
    cout << "value: " << *p_i << endl;
    ++p_i;
    cout << "adress: " << p_i << "   ";
    cout << "value: " << *p_i << endl;
    ++p_i;

    cout << "\npointer to short (2 bytes)\n";

    cout <<  "adress: " << p_c << "   ";
    cout <<  "value: " << *p_c << endl;
    ++p_c;
    cout <<  "adress: " << p_c << "   ";
    cout <<  "value: " << *p_c << endl;
    ++p_c;
    cout <<  "adress: " << p_c << "   ";
    cout <<  "value: " << *p_c << endl;
    ++p_c;
    cout <<  "adress: " << p_c << "   ";
    cout <<  "value: " << *p_c << endl;
    ++p_c;

    return 0;
}

以上代码输出:

pointer to int (4 bytes)
adress: 0x28ff24   value: 5
adress: 0x28ff28   value: 2686754
adress: 0x28ff2c   value: 2686764
adress: 0x28ff30   value: 2686800

pointer to short (2 bytes)
adress: 0x28ff22   value: 97
adress: 0x28ff24   value: 5
adress: 0x28ff26   value: 0
adress: 0x28ff28   value: -216

正如你所看到的,短指针会增加&#34;增加&#34;作为一个短的两个步骤占用2个字节的内存而不是int,它更长并占用四个字节(在我的系统上,即)。

我建议参考有关数据类型长度的文档(它们可以在系统和编译器之间变化)和指示以获取更多信息。

答案 1 :(得分:0)

你在做的是指针算术。将指针(不是值)增加1的结果取决于指针的类型。在您的示例中,实际地址不会增加1,而是增加4(或sizeof(int))。

也没有这样的东西
  

我会得到相同的值,因为我仍在4个单元格中的一个