Il me semble utile d'apporter une précision sur ceci.
Dans pratiquement tous les langages, une fonction renvoie quelque-chose.
Dans le langage mathématique une fonction "renvoie un résultat", ceci peut être synthétisé ainsi "y = f(...)"
Il en est à peu près de même en informatique, une fonction "renvoie" quelque-chose.
Il y une exception de taille : les constructeurs.
Un constructeur, comme un destructeur ne revoie rien.
Pour rappel, un constructeur est une fonction qui crée un objet dans les langages orientés objet.
La syntaxe type est
OBJET *unObjet = new OBJET(...);
new est un opérateur qui renvoie un pointeur.
Cet opérateur appelle une fonction qui fait quelque-chose, mais ne renvoie rien.
J'ai utilisé un langage interprété dont la syntaxe est constituée d'instructions de la forme
ABCD,V1,V2, ... Vn
Où ABCD est le nom de l'instruction, et les noms Vn des variables.
Il est vrai que cette syntaxe est un peu déroutante lorsqu'on a fait de la programmation.
L'utilisation des pointeurs en C prend toute sa signification dans ce contexte.
Exemple l'instruction d'ouverture de fichier s'écrit ainsi
FILE *fic = fopen("MonFic.txt","rt"); // par exemple
La valeur renvoyée est un pointeur sur quelque-chose qui définit un fichier (son âge, sa taille, son auteur, son contenu etc.). La valeur renvoyée est sur 32 bits (4 octets).
Je tenais à préciser cela pour qu'il n'y ait pas dambigüité sur ce qui a été dit dans les réponses précédentes.