Указатели для начинающих (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.