Указатели для начинающих (Pointers) - Пример

ОГЛАВЛЕНИЕ

 

Пример

Указатели - это сложная тема, и вам стоит четко и точно понимать их, потому что понадобится  какое-то время, прежде чем вы сможете ими легко управлять. Вот пример, который демонстрирует приведенные выше принципы. Он написан на языке C, без расширений C++.

#include <stdio.h>

void main()
{
    // объявление переменных:
    int nNumber;
    int *pPointer;

    // теперь мы придаем им значения:
    nNumber = 15;
    pPointer = &nNumber;

    // выводим значение nNumber:
    printf("nNumber равно : %d\n", nNumber);

    // теперь мы изменяем значение nNumber посредством pPointer:
    *pPointer = 25;

    // докажем, что nNumber изменилось в результате указанного
    // выше кода и выведем снова значение:
    printf("nNumber равно : %d\n", nNumber);
}

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

Ловушка

Прочтите следующий код и постарайтесь найти погрешность:

#include <stdio.h>

int *pPointer;

void SomeFunction();
{
    int nNumber;
    nNumber = 25;   

    // pPointer с указанием на nNumber:
    pPointer = &nNumber;
}

void main()
{
    SomeFunction(); // заставляем pPointer указывать на что-нибудь
    // почему это не сработало ?
    printf("Значение *pPointer: %d\n", *pPointer);
}

Данная программа сначала вызывает функцию SomeFunction , которая создает переменную под названием nNumber и затем создает указатель на нее pPointer. Тем не менее, далее начинаются проблемы. При выходе из функции nNumber удаляется потому, что она является локальной переменной. Локальные переменные всегда удаляются при выходе из блока, где они были определены. Это означает, что когда SomeFunction возвращается в main(), переменная будет удалена. Итак, pPointer указывает на место, где была переменная, но которая уже не принадлежит данной программе. Если вам это непонятно, то вам стоит изучить тему локальных и глобальных переменных, а также области их действий - данный принцип также очень важен.

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