Думайте об этом так:
Если
char myChar;
объявляет переменную, которая хранит символ,
int* myPtr;
объявляет переменную, которая хранит адрес памяти.
Аналогично, если
char myCharFunction();
объявляет функцию, которая возвращает символ,
int* myPtrFunction();
объявляет функцию, которая возвращает адрес памяти.
Поэтому, поскольку подпись вашей функции int* FunctionB(int x)
, она верна при возврате адреса памяти.
Здесь важно понять, что int*
означает «адрес памяти». И то, что мы называем «указателем», - это не что иное, как переменная , которая хранит в памяти адрес . Когда кто-то говорит, что указатель «указывает на адрес», все, что он имеет в виду, это то, что указатель содержит этот адрес в себе (так же, как переменная char
будет содержать символ).