我偶然发现一些包含以下内容的代码:
struct ABC { unsigned long array[MAX]; } abc;
什么时候使用这样的声明是有意义的?
它允许您通过值将数组传递给函数,或者通过值从函数中获取数组。
结构可以通过值传递,这与在这些上下文中衰减为指针的数组不同。
可以复制 struct 并从函数返回 struct。
您不能使用数组进行此操作——除非它是 struct 的一部分!
你可以这样复制。
struct ABC a, b; ........ a = b;
对于数组,您需要使用 Memcpy函数或循环来分配每个元素。
另一个优点是它抽象出了大小,所以无论在哪里声明这样的对象,都不必在代码中使用 [MAX]。这也可以通过
[MAX]
typedef char ABC[MAX];
但是接下来你有一个更大的问题: 你必须意识到 ABC是一个数组类型(即使你在声明类型为 ABC的变量时看不到这一点) ,否则你会因为 ABC在函数参数列表和变量声明/定义中的含义不同而感到困扰。
ABC
另一个优点是,如果需要,结构允许您稍后添加更多元素,而不必重写大量代码。
您可以使用 struct 创建一个新类型的数据,比如 绳子。您可以定义:
struct String { char Char[MAX]; };
或者您可以创建一个 名单数据,您可以通过函数的参数使用它,或者在方法中返回它。Struct 比数组更灵活,因为它可以支持一些运算符,比如 = ,并且可以在其中定义一些方法。
希望对你有用:)
一个结构可以包含数组初始化、拷贝和完成模拟 OOP 内存管理范例的一些优点的函数。实际上,很容易扩展这个概念来编写一个通用内存管理实用程序(通过使用 sizeof ()结构来确切知道管理的字节数)来管理任何用户定义的结构。许多用 C 编写的智能生产代码库大量使用这些代码,通常从不使用数组,除非它的作用域非常局部。
实际上,对于嵌入在结构中的数组,您可以在任何想要访问该数组的时候执行其他“智能操作”,例如绑定检查。同样,除非数组作用域非常有限,否则使用它并在程序之间传递信息是一个糟糕的主意。迟早有一天,你会遇到虫子,它们会让你夜不能寐,毁了你的周末。
使用这样的 struct的另一个优点是,无论在哪里使用这样的 struct,它都是 执行类型安全; 特别是如果有两种类型由用于不同目的的大小相同的数组组成,这些类型将帮助您避免意外地不适当地使用数组。
struct
如果你没有在 struct中包装一个数组,你仍然可以为它声明一个 typedef: 这有一些 struct的优点-•类型声明一次,•大小自动正确,•代码的意图变得更加清晰,•代码更容易维护,但是你失去了严格的类型安全,能够复制和返回类型的值,以及能够在不破坏其余代码的情况下添加成员。对于给定类型的裸数组,两个 typedef只有在大小不同的情况下才会产生不同的类型。此外,如果在函数参数中使用不带 *的 typedef,那么它就相当于 char *,大大降低了类型安全性。
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