我遇到了一些包含以下内容的代码:
struct ABC {
unsigned long array[MAX];
} abc;
什么时候使用这样的声明是有意义的?
答案 0 :(得分:182)
它允许您通过值将数组传递给函数,或者通过函数的值返回它。
结构可以通过值传递,而不像在这些上下文中衰减为指针的数组。
答案 1 :(得分:82)
另一个优点是它抽象了大小,因此无论在哪里声明这样的对象,都不必在代码中使用[MAX]
。这也可以用
typedef char ABC[MAX];
但是你有一个更大的问题:你必须要知道ABC
是一个数组类型(即使你在声明ABC
类型的变量时也看不到这个)或者其他你会被ABC
在函数参数列表和变量声明/定义中表示不同的事实所困扰。
另一个优点是,如果需要,结构允许您稍后添加更多元素,而无需重写大量代码。
答案 2 :(得分:45)
您可以复制结构并从函数返回结构。
你不能用数组做 - 除非它是结构的一部分!
答案 3 :(得分:26)
你可以像这样复制它。
struct ABC a, b;
........
a = b;
对于数组,您需要使用 memcpy 函数或循环来分配每个元素。
答案 4 :(得分:11)
您可以使用struct来制作新类型的数据,例如字符串。你可以定义:
struct String {
char Char[MAX];
};
或者您可以创建列表数据,您可以通过函数参数将其用于其中,也可以在方法中将其返回。结构比数组更灵活,因为它可以支持像=这样的运算符,你可以在其中定义一些方法。
希望它对你有用:)
答案 5 :(得分:1)
结构可以包含数组初始化,复制和fini函数,模拟OOP内存管理范例的一些优点。事实上,很容易扩展这个概念来编写通用内存管理实用程序(通过使用sizeof()结构来确切地知道要管理多少字节)来管理任何用户定义的结构。许多用C语言编写的智能生产代码库都会大量使用这些代码库,除非其范围非常局部,否则通常不会使用数组。
事实上,对于嵌入在结构中的数组,您可以执行其他“智能操作”,例如在您想要访问此数组时进行绑定检查。同样,除非阵列范围非常有限,否则使用它并跨程序传递信息是一个坏主意。迟早,你会遇到虫子,让你夜不能寐,毁了周末。