Answers:
它允许您按值将数组传递给函数,或从函数中按值返回它。
可以通过值传递结构,这与在这种情况下会衰减到指针的数组不同。
另一个优点是,它抽象了大小,因此[MAX]
无论您在哪里声明这样的对象,都不必使用所有代码。这也可以通过
typedef char ABC[MAX];
但是然后您遇到了一个更大的问题:您必须意识到这ABC
是一个数组类型(即使在声明type变量时看不到该数组类型ABC
),否则您会被事实所困扰,这ABC
意味着不同的东西在函数参数列表中,而不是在变量声明/定义中。
另一个优点是,该结构允许您以后根据需要添加更多元素,而无需重写大量代码。
您可以像这样复制它。
struct ABC a, b;
........
a = b;
对于数组,您需要使用memcpy函数或循环来分配每个元素。
您可以使用struct生成新型数据,例如string。您可以定义:
struct String {
char Char[MAX];
};
或者您可以创建一个数据列表,您可以通过函数的参数使用它,也可以在方法中返回它。该结构比数组更灵活,因为它可以支持=等某些运算符,并且您可以在其中定义一些方法。
希望对您有用:)
使用这样的a的另一个优点struct
是,无论使用什么a ,它都可以强制类型安全struct
。特别是如果您有两种类型,这些类型由大小相同的数组组成,用于不同目的,则这些类型将帮助您避免意外使用数组。
如果您没有将数组包装在中struct
,则仍然可以typedef
为其声明a :这具有以下优点struct
:•类型声明一次,•大小自动正确,•代码意图更清晰,•并且代码更易于维护-但是您将失去◦严格的类型安全性,◦复制和返回该类型的值的能力以及◦稍后添加成员而不破坏其余代码的能力。两个typedef
S代表给定类型的裸阵列只产生如果它们是不同尺寸的不同类型。此外,如果您使用typedef
没有*
在一个函数的参数,它相当于char *
,大幅降低类型安全。
总结:
typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char A_c_t[113]; // Partial type-safety, not assignable
A_s_t v_s(void); // Allowed
A_c_t v_c(void); // Forbidden
void s__v(A_s_t); // Type-safe, pass by value
void sP_v(A_s_t *); // Type-safe
void c__v(A_c_t); // UNSAFE, just means char * (GRRR!)
void cP_v(A_c_t *); // SEMI-safe, accepts any array of 113
一个结构可以包含数组初始化,复制和fini函数,这些函数模拟了OOP内存管理范例的某些优点。实际上,扩展此概念以编写通用的内存管理实用程序(通过使用sizeof()结构确切地知道要管理多少字节)来管理任何用户定义的结构非常容易。许多用C编写的智能生产代码库都大量使用这些代码,并且除非其范围非常局部,否则通常不使用数组。
实际上,对于嵌入在结构中的数组,您可以在需要访问此数组时执行其他“智能操作”,例如绑定检查。同样,除非数组范围非常有限,否则使用它并在程序之间传递信息是一个坏主意。迟早,您会遇到一些错误,这些错误会使您在晚上醒着,并破坏了周末。
struct
包含一个数组的问题。