C语言结构体的声明和定义

  在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

一、结构体的声明和定义

  在嵌入式系统中,对内存很敏感。所以在使用结构体时要注意“声明结构体类型”和“定义结构体变量”的区别。声明结构体类型只是指定了一个结构体的类型,它相当于一个模型,但其中并无具体数据,系统对之也不分配实际的内存单元。
  声明一个结构体类型的一般形式为:
  struct 结构体名
  {成员列表};

  要定义结构变量,则一般形式是:
  struct 结构体名 结构体变量名;
  在使用结构体时要注意结构体类型名和结构体变量名。构体类型名相当于“int a”里面的int,结构体变量名相当于a。
  注意区分下面几个定义:

struct Student{         //声明结构体
    char name[20];      //姓名
    int num;            //学号
    float score;        //成绩
};

  声明一个结构体类型Student,此时未分配内存单元。

struct Student stu1;    //定义结构体变量

  定义一个结构体变量stu1,此结构体变量的类型为Student,此时为变量stu1分配了内存单元。

truct Student{        
    char name[20];       
    int num;             
    float score;         
}stu1;                  //在定义之后跟变量名

  在声明一个结构体类型Student的时候也定义一个结构体变量stu1,此时为变量stu1分配了内存单元。

struct {                //没有结构名
    char name[20];       
    int num;            
    float score;         
}stu1;  

  使用匿名结构体来直接定义了一个结构体变量stu1,此时为变量stu1分配了内存单元。
  在结构体的定义中经常使用typedef,typedef struct 是为了使用结构体更方便。

typedef struct
{
   int no;
   char name[12];
}Student;

  此处定义了一个结构体类型,此时未分配内存单元。利用此结构体类型进行定义时不需要带struct,可直接定义。相当于先定义了一个匿名结构体,然后将该匿名结构体类型定义为别名Student。
  利用该结构体类型定义结构体变量的方法如下:

 Student stu1;    //定义结构体变量

  还有一种结构体定义方法如下:

typedef struct Student
{
   int no;
   char name[12];
}my_student;

  此处定义了结构体类型,并不分配内存变量。相当于定义了结构体类型Student,然后Student类型又定义为Stu1。利用该结构体类型定义结构体变量的方法可以有两种分别如下:

struct Student stu1;    //定义结构体变量
my_student stu2;//定义结构体变量

  下面这种定义方法是错误的

typedef struct Student
{
   int no;
   char name[12];
};

二、结构体指针

  当一个指针变量用来指向了一个结构变量,这个指针就成了结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。可以通过指针来访问结构变量。
  定义结构指针变量的一般形式:
struct 结构名 * 结构指针变量名

struct Student *pstu;       //定义了一个指针变量,它只能指向Student结构体类型的结构体变量

  结构指针变量的定义也可以与结构体的定义同时。而且它必须先赋值后使用。数组名表示的是数组的首地址,可以直接赋值给数组指针。但结构变量名只是表示整个结构体变量,不表示结构体变量的首地址,所以不能直接赋值给结构指针变量,而应该使用 & 运算符把结构变量的的地址赋值给结构指针变量。
  通过结构指针间接访问成员值,访问的一般形式:
(*结构指针变量). 成员名 或 结构指针变量 -> 成员名

(*pstu).name    
pstu->name

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值