不熟悉的C systax - 在结构后声明变量

时间:2013-10-05 18:16:47

标签: c struct

 #include "stdio.h"
  void main( )
  {
   struct {
    char initial;
    int age;
    int grade;
   } kids[12], *point, extra;

我正在按照http://www.gatesit.org/gitdownloads/C&DS.pdf第813-22页的教程进行操作,我不太明白什么是孩子[12],*指出,额外的;手段。据我所知,你可以在定义之后初始化struct的变量,但是为什么有一个数组大小为12,一个指针和一个额外的?

以下是代码。

 int index;
 for (index = 0; index < 12; index++)
{
  point = kids + index;
  point->initial = 'A' + index;
  point->age = 16;
  point->grade = 84;
 }

 kids[3].age = kids[5].age = 17;
 kids[2].grade = kids[6].grade = 92;
 kids[4].grade = 57;

 for (index = 0; index < 12; index++)
 {
  point = kids + index;
  printf("%c is %d years old and got a grade of %d\n",
  (*point).initial, kids[index].age, point->grade);
 }

 extra = kids[2]; /* Structure assignment */
 extra = *point; /* Structure assignment */

 }

4 个答案:

答案 0 :(得分:4)

struct mystruct {
    char initial;
    int age;
    int grade;
} kids[12], *point, extra;

相当于:

struct mystruct {
    char initial;
    int age;
    int grade;
};
struct mystruct kids[12];
struct mystruct *point;
struct mystruct extra;

在您的特定情况下,您的结构没有标记名称,因此您实际上无法在之后创建任何实例 - 这是您可以执行此操作的唯一方法,因为它未命名。

因为这里的结构是在函数内部定义的,并且它的定义只能在该函数中使用,所以你可能不需要再定义它的实例,所以没有名字也没有缺点。另一方面,除了在标记命名空间中少了一个名称(因此避免了在文件范围内隐藏标记名称的可能性)之外,它也没有特别的优势。

答案 1 :(得分:3)

struct {
    char initial;
    int age;
    int grade;
} kids[12], *point, extra;

此结构未命名。

这将创建一个包含12个此结构的数组,名为kids,指向此类结构的指针point,另一个结构名为extra

对于仅在少数几个有限的地方使用的一次性结构,这是可以接受的。在一个更大的使用案例中,我会考虑这种“马虎”,并希望看到这样的东西:

typedef struct {
    char initial;
    int age;
    int grade;
} student_t;

int main() {
    student_t kids[12];     // 12 students in the class
    student_t* pStudent;    // A pointer to a student_t
    student_t extra;        // The new kid
}

答案 2 :(得分:2)

您正在声明struct的12个元素数组,struct类型的变量和指向struct的指针。然后代码显示了可以使用这些类型的变量来访问struct的内部部分的不同方式,以及如何在彼此之间分配项目。

答案 3 :(得分:2)

这基本上定义了一个由定义的结构kids[12]的12个元素组成的数组,另一个变量是指向定义的结构*point的单个指针,最后是结构extra的单个实例。

由于struct没有名称,我想你必须在struct定义旁边一次定义所有这些名称。

同样地,它可能是这样的:

struct kid {
    char initial;
    int age;
    int grade;
   };

struct kid kids[12];
struct kid *pointer;
struct kid extra;