Nếu bạn làm việc với "đối tượng" trong C, bạn có thể có này:
struct customer {
char *name;
char *address;
int id;
} typedef Customer;
Nếu bạn muốn tạo một đối tượng, bạn sẽ làm một cái gì đó như thế này:
Customer *customer = malloc(sizeof Customer);
// Initialise state.
Chúng tôi đang sử dụng con trỏ đến số struct
tại đây vì struct
đối số được chuyển theo giá trị và chúng tôi cần làm việc với một đối tượng. (Ngoài ra: Objective-C, một hướng đối tượng ngôn ngữ wrapper cho C, sử dụng con trỏ trong nội bộ nhưng rõ ràng để struct
s.)
Nếu tôi cần phải lưu trữ nhiều đối tượng, tôi sử dụng một mảng:
Customer **customers = malloc(sizeof(Customer *) * 10);
int customerCount = 0;
Vì biến mảng trong C điểm cho mục đầu tiên, tôi sử dụng một con trỏ… một lần nữa. Bây giờ tôi có con trỏ kép.
Nhưng bây giờ hãy tưởng tượng tôi có một chức năng lọc mảng và trả về một mảng mới. Nhưng hãy tưởng tượng nó không thể thông qua cơ chế trả về vì nó phải trả về một mã lỗi — hàm của tôi truy cập cơ sở dữ liệu. Tôi cần phải làm điều đó thông qua một đối số tham chiếu.Đây là chữ ký chức năng của tôi:
int filterRegisteredCustomers(Customer **unfilteredCustomers, Customer ***filteredCustomers, int unfilteredCount, int *filteredCount);
Chức năng mất một mảng của khách hàng và trả về một tham chiếu đến một mảng của khách hàng (mà là con trỏ đến một struct
). Nó cũng lấy số lượng khách hàng và trả về số lượng khách hàng được lọc (một lần nữa, đối số tham chiếu).
tôi có thể gọi nó theo cách này:
Customer **result, int n = 0;
int errorCode = filterRegisteredCustomers(customers, &result, customerCount, &n);
tôi có thể đi vào tưởng tượng tình huống thêm ... Cái này là nếu không có sự typedef
:
int fetchCustomerMatrix(struct customer ****outMatrix, int *rows, int *columns);
Rõ ràng, tôi sẽ là một kinh khủng và/hoặc nhà phát triển tàn bạo để lại nó theo cách đó. Vì vậy, sử dụng:
typedef Customer *CustomerArray;
typedef CustomerArray *CustomerMatrix;
tôi có thể chỉ làm điều này:
int fetchCustomerMatrix(CustomerMatrix *outMatrix, int *rows, int *columns);
Nếu ứng dụng của bạn được sử dụng trong một khách sạn nơi bạn sử dụng một ma trận cho mỗi cấp độ, có thể bạn sẽ cần một mảng để một ma trận :
int fetchHotel(struct customer *****hotel, int *rows, int *columns, int *levels);
Hoặc chỉ này:
typedef CustomerMatrix *Hotel;
int fetchHotel(Hotel *hotel, int *rows, int *columns, int *levels);
Đừng làm cho tôi thậm chí bắt đầu trên một mảng của khách sạn: (? Một số loại tập đoàn khách sạn lớn)
int fetchHotels(struct customer ******hotels, int *rows, int *columns, int *levels, int *hotels);
... sắp xếp theo một ma trận:
int fetchHotelMatrix(struct customer *******hotelMatrix, int *rows, int *columns, int *levels, int *hotelRows, int *hotelColumns);
Những gì tôi đang cố gắng để nói là bạn có thể tưởng tượng các ứng dụng điên rồ cho nhiều người không đồng ý. Chỉ cần đảm bảo bạn sử dụng typedef
nếu nhiều con trỏ là ý tưởng hay và bạn quyết định sử dụng chúng.
(Liệu đếm bài đăng này là một ứng dụng cho một SevenStarDeveloper?)
Đây là câu hỏi rất _indirect_. –
Để trở thành http://c2.com/cgi/wiki?ThreeStarProgrammer –
Bạn cũng có thể thưởng thức [cdecl] (http://cdecl.org/) – bobobobo