Указатели в C++ для начинающих.

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

Указатели в C++ для начинающих обычно очень непонятны. Связано это с двойственностью природы указателей. Указатель — это переменная, которая хранит адрес памяти.
В статье Указатели в C++ для начинающих. Поверхностное знакомство было описано очень мало, но что такое указатели знать нужно и надо иметь представление как с ними работать.

В C++ указатель объявляется с помощью звездочки

так как указатель хранит адрес памяти, то попытка обращения к указателю вернет этот адрес. Если x объявлен как указатель, то

чтобы указатель обрабатывал значение, а не адрес памяти, используется операция разыменования

В этом примере сначала на экран выведется какое-то любое значение, после чего по адресу памяти на который указывает x будет записано число 100. Так как в обоих случаях было применено разыменование, то будут выведены именно значения, а не адреса памяти.

Код C++ Указатель + Разыменованный указатель

Будьте внимательны в приведенном коде, где была операция разыменования, стоит звездочка. В первый раз было обращение непосредственно к указателю, а так как указатель есть переменная, хранящая адрес памяти, то именно с этим адресом памяти и работает программа при прямом обращении к указателю, поэтому и был выведен некоторый адрес памяти вместо значения. Во второй раз при обращении к указателю была поставлена звездочка. Такое обращение к указателю называется разыменование и указатель обращается к объекту на который ссылается. На экран было выведено значение, а не адрес памяти

Я бы порекомендовал любому начинающему поупражняться в выводе на экран адреса, который хранит указатель и в выводе значения, которое располагается по адресу, на который указатель ссылается. Очень важно понимать различие первого от второго. Это стоит знать как Hello World

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

В C++ у любой переменной, в том числе и не указателя можно узнать адрес памяти, по которому она расположена. Делается это с помощью оператора &

Код C++ Взять адрес у переменной. Ссылка

Так вот, после объявления указатель не связан с конкретным значением и указывает пальцем в небо. Для того, чтоб его связать с каким-то объектом используется оператор &. Вы уже знаете, что оператор & обозначает взятие памяти у переменной. А так как указатель есть адрес памяти, то и работает он с адресами памяти.
Следовательно, чтобы связать указатель с каким-то значением, нужно обратиться к адресу нужного значения. Надеюсь логика проста и понятна.

Код C++. Связать указатель с переменной

Очень важный момент
Если указатель указывает на некоторый один адрес памяти, то и работает он со значением из этого адреса.

  • а) Изменяя значение переменной по адресу на который указатель указывает — изменится и значение разыменовываемого указателя
  • б) При присвоении значений разыменованному указателю — изменится значение переменной по указываемому указателем адресу

Код C++ двойственность природы указателей

Двойственность природы указателей причина многих недопониманий и ошибок. Понять для начинающих очень непросто, но понять можно. А вот, чтобы с ними дружить надо понимать природу указателей и как с ними работать на превосходное отлично.

Подводя итоги я повторюсь и напишу самое главное из этой статьи про указатели.

  • Указатель — это вид переменной, которая хранит адрес в памяти
  • Объявляется указатель с помощью звездочки
  • Чтобы обратиться к значению по адресу указателя используется разыменование
  • У любой переменной можно взять адрес памяти. Для этого используется символ &
  • Так как указатель есть адрес памяти, то ему можно присвоить адрес памяти от любой переменной
  • У указателя двойственная природа. Можно обрабатывать адрес памяти, а можно значение внутри этого адреса.

Понять сложно, но можно. самое главное старайтесь понять, а не заучить

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

13 комментариев: Указатели в C++ для начинающих.

  • Виктория говорит:

    а есть ли разница чему присваивать адрес памяти,разыменованному указателю или просто указателю? у меня в программе например:*ptr=&a;а вы пишете:ptr=&a;

    Автор сайта отвечает:
    Да. *ptr=&a; — В сам элемент с которым работает указатель записано новое значение равное адресу памяти. ptr=&a; — Указатель сменил свои позиции и ссылается на новый элемент, который расположен по адресу на который ссылается a
     
    Виктория, думаю вам полезно будет посмотреть на код
    void main(){
    int a=100;
    int *ptr;
    *ptr=&
    a; //cout<<*ptr<<endl;
    }
    Маленький и простой, но не должен выполнится.
    *ptr=&a; //Тут ошибка. Это вы в int пытаетесь присвоить адрес памяти
    ptr=&a; //Ошибок нет. Так вы сообщаете — меняя указатель — менять переменную int aДело в двойственности указателя. Надеюсь не запутал

  • Anonymous говорит:

    После обьявления указателю обязательно должно присваиваться какое-либо значение. Если заранее неизвестно ,какой адрес должен храниться в указателе ,ему присваивается значение 0. Неинициализированные указатели в дальнейшем могут стать причиной больших неприятностей.

    Автор сайта отвечает:
    Инициализацию после объявления предполагают правила хорошего тона программирования, но это не обозначает обязательность. Абсолютно также как с обычными переменными.
    И лучше, действительно, инициализировать.

  • yana говорит:

    подскажите пожалуйста книги где хорошо выложена эта тема. заранее спасибо.

    Автор сайта отвечает:
    Этого вот не знаю. Никто не знает, что для вас хорошо и насколько хорошо должно быть описано. Вы уж простите.

  • Аноним говорит:

    В этом коде ошибка

    Указателю нужно сначала присвоить хоть какое-то значение, нужно дописать перед cout строку — ptr = &x;

    Автор сайта отвечает:
    Тут такой момент, что код рабочий может выглядеть так

    , но такой код вызовет миллион вопросов по new и delete, а новичка это скорее всего сильнее запутает. Вроде итак запутанно очень сильно.

  • Вася говорит:

    Ошибка в коде

    #include
    #include

    int x=20; //Переменная x = 20
    int *ptr; //ptr есть указатель на int

    void main()
    {
    clrscr();
    //Выводим на экран различные значения
    cout<<"ptr = "<<ptr<<endl; //Указатель ptr= Адрес памяти
    cout<<"*ptr"<<*ptr<<endl; //Разыменованный указатель ptr= Значение по адресу
    getch();
    return;
    }
    Для начала нужно присвоить указателю хоть какое-либо значение , нужно дописать перед cout — ptr = &x;

  • Аноним говорит:

    😈 😈 😈 😈 😈 😈 😈 😈

  • Ivan говорит:

    Здравствуйте!
    Я никак не могу понять, что значит &p->name, это значит значение переменной name записать по адресу p? Надеюсь на подсказку

    Автор сайта отвечает:
    нет. это не записать. и где вы такое увидели?.

  • Oksana говорит:

    5 int *ptr; //ptr есть указатель на int
    — неинициализированный указатель !

    Инициализация указателей :
    Использование неинициализированных указателей чрезвычайно опасно. Вы можете легко перезаписать произвольную область памяти через неинициализированный указатель. Полученный ущерб при этом зависит лишь от степени вашего везения, поэтому инициализировать указатели — более чем хорошая идея. Очень легко инициализировать указатель адресом переменной, которая уже определена.

    pnumber = &numberl; // Сохранить адрес в указателе

    Конечно, объявляя указатель, вы можете решить не инициализировать его адресом определенной переменной. В этом случае его можно инициализировать указателем, эквивалентным нулю. Для этого в Visual C++ предусмотрен символ NULL, который уже определен как 0, поэтому указатель можно объявлять и инициализировать с помощью следующего оператора вместо того, что вы видели ранее:

    int* pnumber = NULL; // Указатель, не указывающий ни на что

    (http://develab.narod.ru/cpp/189.htm)

    Автор сайта отвечает:
    Да. неицинализорованный указатель и указывает он на тип int/
    конечно неправильно так говорить, но так его читают.
    по-русски он читается, как: Указатель, указывающий на ячейку памяти, где тип значения чего-то там лежащего должен быть int, но, блин, это долго и длинно.

    из-за того-что в ячейке лежит фиг знает что, и фиг знает какой у этого фига тип, указатель просто может психануть и уронить программу., но может и не уронить.
    там в вашей цитате слово «произвольную», а «совершенно случайную» лучше подходит.

    А вы знаете почему предпочтение отдают инициализацией NULL, а не нулем?
    и еще, чтоб все знали NULL не символ

    • NULL в языках программирования Си и C++ — макрос

    Символ — это один какой-то единый знак, а тут целое слово из 4 символов.

  • прок говорит:

    так как указатель хранит адрес памяти, то попытка обращения к указателю вернет этот адрес. Если x объявлен как указатель, то

    у меня ошибку выводит Ошибка 1 error C4700: использована неинициализированная локальная переменная “tt” c:\users\sррр\documents\visual studio 2013\projects\consoleapplication8\consoleapplication8\consoleapplication8.cpp 9 1 ConsoleApplication8

    • admin говорит:

      Где-то в коде у вас переменная tt
      У меня в примерах такой переменной нету.
      Нужно найти и присвоить ей начальное значение. int tt=0;

  • Валерий говорит:

    Не  могу понять, почему совмещение с инициализацией выглядит так:   тип *ptr=имя переменной. Но ведь указатель под звёздочкой есть величина переменной.

    Автор сайта отвечает:
    Потому что это не присваивание, а инициализация указателя. Во время инициализации не происходит разыменования, а уже после инициализации звездочка перед переменной является указанием к разыменованию. Так уж решили.

  • DN говорит:

  • Джони говорит:

    Всё классно. Разжёвано.. Спасибо

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

-Папа, а что такое "высшее образование"? -Это то, что в 80-х годах прошлого века называлось "среднее"..

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок