Указатели, sizeof () и адреса в C ++

c++ pointers sizeof pointer-arithmetic

971 просмотра

2 ответа

Это программа

int main() {   
    cout << sizeof(int) << endl;        // for int its 4 in g++ compiler

    int *p;
    int a = 5;
    p = &a;
    cout << "The value of p is: " << p << endl;
    cout << "The value of p + integer is: " << p + 0 << endl;

    // lets take the size of individual 1, 2, 3
    cout << "The sizeof(0) is: " << sizeof(0) << endl;   // 4
    cout << "The sizeof(1) is: " << sizeof(1) << endl;   // 4
    cout << "The sizeof(2) is: " << sizeof(2) << endl;   // 4

    cout << "The value of p + 0 is: " << p + 0 << endl;
    cout << "The value of p + 1 is: " << p + 1 << endl;
    cout << "The value of p + 2 is: " << p + 2 << endl;

    return 0;
}

sizeof()Функция в C ++ дает sizeof(int)4 байта, в g++компиляторе. Так что я напечатал sizeof(1), sizeof(2), sizeof(0)к терминалу , и я получил 4 байта.

Таким образом, я попробовал некоторую арифметику указателя в программе по ссылке выше. Я добавил 1 к переменной указателя. Давайте скажем int *p; int a = 10;. Теперь я назначен p = &a;. Теперь, когда я печатаю, pэто дает, 0x24fe04и когда я печатаю, p + 0это то же самое. Но когда я попытался добавить p + 1и p + 2это дает другой результат , как это: 0x24fe08, 0x24fe0cсоответственно. Пожалуйста, помогите мне понять эту арифметику. Да p+1, p+2не равно, как в адресе, он вносит те же 4 байта.

Автор: an0nh4x0r Источник Размещён: 08.11.2019 11:29

Ответы (2)


0 плюса

Решение

Когда вы говорите p + 1, это значит p + 1 * sizeof(int). Как я уже говорил здесь , формула

                                𝑎𝑑𝑑𝑟𝑒𝑠𝑠 = 𝑏𝑎𝑠𝑒 + 𝑖𝑛𝑑𝑒𝑥 × 𝑠𝑖𝑧𝑒

Вот почему вы получаете 0x24fe04, пытаясь p + 0, и получить 0x24fe08заp + 1

Автор: snr Размещён: 20.08.2016 04:36

0 плюса

Указатель именно такой, он указывает на другую область памяти.

int a = 3; 
int *p = &a;
++a;
std::cout << p << std::endl;    
std::cout << *p << std::endl;
std::cout << &p << std::endl;
std::cout << &a << std::endl;

должен вывести:

The address of a
4
The address of p
The address of a

Если вы выполняете p + 1, вы перемещаете 4 байта вверх по стеку от адреса a, потому что на 32-битных машинах память индексируется в соответствии с этим выравниванием. На 64-битных машинах это выравнивание удваивается, поэтому нельзя смешивать 32-битный и 64-битный код из-за различий в индексе памяти.

У вас также есть указатели указателей, так что вы можете манипулировать указателями

int **pp = &p
std::cout << *pp; // = 4 = p = a

редактировать

Должен был проверить это, моя ошибка, я исправил вышесказанное благодаря Бенджамину Линдли

Автор: clu Размещён: 20.08.2016 04:03
Вопросы из категории :
32x32