Если вы работаете с «объектами» в C, вы, вероятно, это:
struct customer {
char *name;
char *address;
int id;
} typedef Customer;
Если вы хотите создать объект, вы могли бы сделать что-то вроде этого:
Customer *customer = malloc(sizeof Customer);
// Initialise state.
Мы» re, используя указатель на struct
здесь, потому что аргументы struct
передаются по значению, и нам нужно работать с одним объектом. (Также: Objective-C, объектно-ориентированный язык обертка для C, использует внутренне, но явно указатели struct
с.)
Если мне нужно хранить несколько объектов, я использую массив:
Customer **customers = malloc(sizeof(Customer *) * 10);
int customerCount = 0;
Поскольку переменная массива в C указывает на первый элемент, я использую указатель ... снова. Теперь у меня есть двойные указатели.
Но теперь представьте, что у меня есть функция, которая фильтрует массив и возвращает новый. Но представьте, что он не может через механизм возврата, потому что он должен вернуть код ошибки - моя функция обращается к базе данных. Мне нужно сделать это через аргумент by-reference.Это подпись моей функции в:
int filterRegisteredCustomers(Customer **unfilteredCustomers, Customer ***filteredCustomers, int unfilteredCount, int *filteredCount);
Функция принимает массив клиентов и возвращает ссылку на массив клиентов (которые являются указателями на struct
). Он также принимает количество клиентов и возвращает количество фильтрованных клиентов (опять же, аргумент ссылки).
Я могу назвать это таким образом:
Customer **result, int n = 0;
int errorCode = filterRegisteredCustomers(customers, &result, customerCount, &n);
Я мог бы себе больше ситуаций ... Это одно без typedef
:
int fetchCustomerMatrix(struct customer ****outMatrix, int *rows, int *columns);
Очевидно, я был бы ужасным и/или садистский разработчик, чтобы оставить его таким образом. Таким образом, используя:
typedef Customer *CustomerArray;
typedef CustomerArray *CustomerMatrix;
я могу просто сделать это:
int fetchCustomerMatrix(CustomerMatrix *outMatrix, int *rows, int *columns);
Если приложение используется в гостинице, где вы используете матрицу на уровень, вам, вероятно, потребуется массив для матрицы :
int fetchHotel(struct customer *****hotel, int *rows, int *columns, int *levels);
Или просто это:
typedef CustomerMatrix *Hotel;
int fetchHotel(Hotel *hotel, int *rows, int *columns, int *levels);
Не поймите меня даже начал массив отелей: (? Какой-то большой гостиницы корпорации)
int fetchHotels(struct customer ******hotels, int *rows, int *columns, int *levels, int *hotels);
... расположены в виде матрицы:
int fetchHotelMatrix(struct customer *******hotelMatrix, int *rows, int *columns, int *levels, int *hotelRows, int *hotelColumns);
То, что я пытаюсь сказать заключается в том, что вы можете представить себе сумасшедшие приложения для нескольких целей. Просто убедитесь, что вы используете typedef
, если многопозиционные указатели - хорошая идея, и вы решили использовать их.
(ли это количество сообщений в качестве приложения для SevenStarDeveloper?)
Это очень _indirect_ вопрос. –
Чтобы стать http://c2.com/cgi/wiki?ThreeStarProgrammer –
Вы можете наслаждаться [cdecl] (http://cdecl.org/) – bobobobo