为什么声明一个只包含C中数组的结构?

Joe*_*e.Z 129 c arrays struct coding-style

我遇到了一些包含以下内容的代码:

struct ABC {
    unsigned long array[MAX];
} abc;
Run Code Online (Sandbox Code Playgroud)

何时使用这样的声明是有意义的?

Bla*_*iev 183

它允许您通过值将数组传递给函数,或者通过函数的值返回它.

结构可以通过值传递,而不像在这些上下文中衰减为指针的数组.


R..*_*R.. 82

另一个优点是它抽象了大小,因此您无需[MAX]在声明此类对象的任何地方使用所有代码.这也可以用

typedef char ABC[MAX];
Run Code Online (Sandbox Code Playgroud)

但是你有一个更大的问题:你必须要知道这ABC是一个数组类型(即使你在声明类型的变量时你看不到这个ABC),否则你会被这个ABC意味着不同的东西所蜇在函数参数列表中与变量声明/定义中.

另一个优点是,如果需要,struct允许您稍后添加更多元素,而无需重写大量代码.


Bo *_*son 45

您可以复制结构并从函数返回结构.

你不能用数组做到这一点 - 除非它是结构的一部分!


Met*_*est 26

你可以像这样复制它.

struct ABC a, b;
........
a = b;
Run Code Online (Sandbox Code Playgroud)

对于数组,您需要使用memcpy函数或循环来分配每个元素.

  • (所以它允许更清晰的代码 - 它不会对速度产生任何影响等) (6认同)
  • 那很有用.不幸的是你不能这样做(a == b)!?!这是多么不一致.对于C++,它查找==运算符.在C中它表示"二进制的无效操作数==". (3认同)

Hos*_*her 11

您可以使用struct来创建一个新类型的数据,如字符串.你可以定义:

struct String {
    char Char[MAX];
};
Run Code Online (Sandbox Code Playgroud)

或者您可以创建一个数据列表,您可以通过函数的参数使用它或将其返回到您的方法中.结构比数组更灵活,因为它可以支持像=这样的运算符,你可以在其中定义一些方法.

希望它对你有用:)

  • @J Sternberg:"方法"只是一种思考子程序与它们影响的数据"对象"相关的方式.你当然可以用C语言创建"对象"和"方法"的"类".语言并没有正式定义这样的东西.如果你想在C中创建更好的抽象,那么将东西填充到结构中通常是最好的方法. (3认同)
  • 基本上,它是C与创建类最接近的东西.我喜欢这个答案,因为它最接近指出. (2认同)