Указатели в С++

Рейтинг: -2Ответов: 3Опубликовано: 17.03.2015

Почитал я несколько статей в Интернете про указатели, но до конца не разобрался.

Вот код:

//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------
#include <stdio.h>
#include <iostream.h>
#pragma argsused
using namespace std;
int main(int argc, char* argv[])
{
    int *pointer;
    *pointer = 1000;
    cout << pointer << endl;
    cout << *pointer << endl;
    cout << &pointer << endl;
    getchar();
    return 0;
}
//---------------------------------------------------------------------------

Собственно, в чем вопрос: в чем разница между & и разыменованной переменной при выводе (кстати, при компиляции все разное при выводе)?

Ответы

▲ 2Принят

Ты создаешь указатель на указатель и удивляешься, что он не совпадает с данными... %)

Советую побольше писать программ на С и почаще использовать указатели. Через некоторое время это станет естественным, как дышать. Возможно, вот такая "картинка" все прояснит:

#include <stdio.h>

int main(void)
{
    int data = 1000;
    int* pointer = &data;
    int** pointer_to_pointer = &pointer;
    printf("%d %d %d\n", data, *pointer, **pointer_to_pointer);
    printf("%p %p\n", (void*)pointer, (void*)*pointer_to_pointer);
    printf("%p\n", (void*)pointer_to_pointer);
    return 0;
}

Для практических задач, чтобы набить руку, можно использовать сайт CodeAbbey.com

▲ 1

cout << pointer << endl;

  • адрес, по которому хранится твое значение

cout << &pointer << endl;

  • адрес, по которому хранится сам указатель (типа адрес, указывающий на место, где хранится адрес, по которому хранится твое значение).
▲ 1

Для лучшего понимания лучше писать так:

int* pointer;

где не тип что-то имя, а тип имя, то есть int * лучше считать отдельным "типом". И если посмотреть на тип нашей переменной, то можно понять, что

cout << pointer;

возвращает именно значение "типа" int , где &pointer - это адрес, по которому хранится наше значение*.

Где значение - адрес на участок памяти, по которому в ходе выполнения программы будет выделена память для типа int, которое можно получить так:

 cout << *pointer;