Si vous travaillez avec des "objets" en C, vous avez probablement ce:
struct customer {
char *name;
char *address;
int id;
} typedef Customer;
Si vous souhaitez créer un objet, il vous faudrait faire quelque chose comme ceci:
Customer *customer = malloc(sizeof Customer);
// Initialise state.
Nous sommes à l'aide d'un pointeur à un struct
ici parce qu' struct
arguments sont passés par valeur et nous avons besoin de travailler avec un objet. (Aussi: Objective-C, une orientée objet wrapper langage C, utilise en interne mais visiblement pointeurs vers struct
s).
Si j'ai besoin de stocker plusieurs objets, j'utilise un tableau:
Customer **customers = malloc(sizeof(Customer *) * 10);
int customerCount = 0;
Depuis une variable de tableau en C points pour le premier point, j'utilise un pointeur... encore une fois. Maintenant, j'ai le double de pointeurs.
Mais imaginez maintenant que j'ai une fonction qui filtre le tableau et retourne un nouveau. Mais imaginez qu'il ne peut pas via le mécanisme de retour, car il doit retourner un code d'erreur-ma fonction accède à une base de données. J'ai besoin de le faire par le biais d'une référence argument. C'est ma fonction de signature:
int filterRegisteredCustomers(Customer **unfilteredCustomers, Customer ***filteredCustomers, int unfilteredCount, int *filteredCount);
La fonction prend un tableau de clients et renvoie une référence à un tableau de clients (qui sont des pointeurs vers une struct
). Il prend également le nombre de clients et renvoie le nombre de filtré les clients (de nouveau, en référence de l'argumentation).
Je peux l'appeler de cette façon:
Customer **result, int n = 0;
int errorCode = filterRegisteredCustomers(customers, &result, customerCount, &n);
Je pourrais continuer à imaginer des situations plus... C'est sans l' typedef
:
int fetchCustomerMatrix(struct customer ****outMatrix, int *rows, int *columns);
Évidemment, je serais un horrible et/ou sadique développeur de quitter de cette façon. Donc, à l'aide de:
typedef Customer *CustomerArray;
typedef CustomerArray *CustomerMatrix;
Je peux faire ça:
int fetchCustomerMatrix(CustomerMatrix *outMatrix, int *rows, int *columns);
Si votre application est utilisée dans un hôtel où vous utilisez une matrice par niveau, vous aurez probablement besoin d'un tableau à une matrice:
int fetchHotel(struct customer *****hotel, int *rows, int *columns, int *levels);
Ou tout simplement ceci:
typedef CustomerMatrix *Hotel;
int fetchHotel(Hotel *hotel, int *rows, int *columns, int *levels);
Ne m'obtenez pas le même commencé sur un tableau d'hôtels:
int fetchHotels(struct customer ******hotels, int *rows, int *columns, int *levels, int *hotels);
...disposées dans une matrice (une sorte de grand hôtel de société?):
int fetchHotelMatrix(struct customer *******hotelMatrix, int *rows, int *columns, int *levels, int *hotelRows, int *hotelColumns);
Ce que j'essaie de dire, c'est que vous pouvez l'imaginer fou des applications pour de multiples indirections. Juste assurez-vous d'utiliser typedef
si le multi-pointeurs sont une bonne idée et que vous décidez de les utiliser.
(Est-ce la nombre de post comme une demande de SevenStarDeveloper?)