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

ОГЛАВЛЕНИЕ

Передача указателей и функции

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

#include <stdio.h>

void AddFive(int Number)
{
    Number = Number + 5;
}

void main()
{
    int nMyNumber = 18;
   
    printf("Оригинальное число равно %d\n", nMyNumber);
    AddFive(nMyNumber);
    printf("Оригинальное число равно %d\n", nMyNumber);
}

Тем не менее, проблема заключается в том, что Number , к которому ссылаются в AddFive является копией переменной nMyNumber , переданной в функцию, а не самой переменной. Тем самым строка Number = Number + 5 добавляет пять к копии этой переменной, при этом оригинальная переменная в main() не будет изменена. Попробуйте запустить программу и убедитесь в этом сами.

Чтобы обойти данную проблему, мы можем передать в функцию указатель того места, где данное число содержится, тем самым она будет ожидать указатель на число, а не число. Для этого мы изменим void AddFive(int Number) на void AddFive(int* Number), добавляя звездочку. Вот данная программа с внесенными изменениями. Заметьте, что мы должны убедиться, что передаем адрес nMyNumber вместо самого числа. Это выполняется посредством добавления символа & , который (как вы уже знаете) читается как "по адресу".

#include <stdio.h>
void AddFive(int* Number)
{
    *Number = *Number + 5;
}

void main()
{
    int nMyNumber = 18;
   
    printf("Оригинальное число равно %d\n", nMyNumber);
    AddFive(&nMyNumber);
    printf("Оригинальное число равно %d\n", nMyNumber);
}

Попробуйте придумать свой пример использования передачи указателей в функцию. Заметьте важность использования символа * до Number в функции AddFive. Это необходимо для указания компилятору, что мы хотим добавить пять к числу, на которое указывает переменная Number, а не добавлять пять к самому указателю. Наконец, последнее, что стоит упомянуть о функциях, так это то, что вы можете возвращать указатели из них примерно так:

int * MyFunction();

 В данном примере MyFunction возвращает указатель на integer.