C语言基础——结构体


1.结构体

        在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。 它相当于其它高级语言中的记录。“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。

 

 2.定义和使用结构体变量

        声明一个结构体类型的一般形式为:

Struct 结构体名

     {成员列表};

花括号里是该结构体所以包含的子项,称为结构体的成员,对各成员都应进行类型声明。即

类型名  成员名;

 

        定义一个结构的一般形式为:

 struct 结构名

     {成员表列};

成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。

成员名的命名应符合标识符的书写规定。例如:

struct Student
     {
         int num;
         char name[20];
         char sex;
         float score;
 };

        在这个结构定义中,结构名为stu,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意在括号后的分号是不可少的。结构定义之后,即可进行变量说明。凡说明为结构Student的变量都由上述4个成员组成。由此可见,结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。


定义结构体类型变量

 

1.先声明结构体类型,再定义该类型的变量。

例如,

struct Student   student 1 ,student 2;

这种形式和定义其他类型的变量形式是相似的。在定义了结构体变量之后磨系统会为之分配内存单元。

2.在声明类型的同时定义变量。

例如,

struct Student 
{  
  int num; 
  char name[20];  
  char sex;  
  int age;  
  float score;  
  char addr[30];  
}

        它的作用与第一种方法相同,但是在定义structStudent 类型的同时定义两个struct Student 类型的变量。这种定义方法的一般形式为

  struct 结构体名

  {

     成员列表

}变量名列表;

3.不指定类型名而直接定义结构体类型变量,其一般形式为

struct

  {

     成员列表

}变量名列表;

指定了一个无名的结构体类型。

 

 结构体类型的作用域
 1. 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
 2.定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)

例如,
// 从这行开始,一直到文件结尾,都是有效(跟全局变量一样)
struct Date
{
    int year;
    int month;
    int day;
};

int a;

void test2()
{
    struct Date
    {
        int year;
    };
    // 这里使用的是test2函数内部的struct Date类型
    struct Date d1 = {2011};
    
    
    // 结构体类型也是有作用域,从定义类型的那一行开始,一直到代码块结束
    struct Person
    {
        int age;
    };
    
    struct Person p;
    
    a  = 10;
}

int main()
{
    struct Date d1 = {2009, 8, 9};
    
    
    test2();
    
    // 不能使用test2函数中定义的类型
    // struct Person p2;
    
    return 0;
}

// 定义结构体变量
void test()
{
    // 定义结构体变量的第3种方式
    struct {
        int age;
        char *name;
    } stu;
    
    struct {
        int age;
        char *name;
    } stu2;



 

3.结构体变量的初始化和引用

        在定义结构体变量时,可以对它初始化。例如,

#include <stdio.h>  
int main()  
{  
  struct Student  
  {  
    long int num;  
    char name[20];  
    int age;  
    char sex;  
  } 
a= {10101,”liiming”,10,’M’};
printf(“num:%ld,name:%s,age:%d,sex:%c”,a.num,a.name,a.age,a.sex);
return 0;

注意;

1.在定义结构体变量是可以对他的成员初始化。

2.可以引用结构体变量中成员的值。

3.如果成员本身又属于一个结构体类型,则要用若干个成员运算符。只能对最低级的成员进行赋值或存取以及计算。

4.对结构体变量的成员可以像普通变量一样进行运算。

5.同类的结构体变量可以相互赋值。

6.可以引用结构体变量成员的地址,也可以引用结构体变量的地址。



4.指向结构体的指针

 1.指向结构体的指针的定义
 struct Student *p;
 
 2.利用指针访问结构体的成员
 1> (*p).成员名称
 2> p->成员名称

#include <stdio.h>
int main()
{
    struct Student
    {
        int no;
        int age;
    };
    // 结构体变量
    struct Student stu = {1, 20};
    
    // 指针变量p将来指向struct Student类型的数据
    struct Student *p;
    
    // 指针变量p指向了stu变量
    p = &stu;
    
    p->age = 30;
    
    // 第一种方式
    printf("age=%d, no=%d\n", stu.age, stu.no);
    
    // 第二种方式
    printf("age=%d, no=%d\n", (*p).age, (*p).no);
    
    // 第三种方式
    printf("age=%d, no=%d\n", p->age, p->no);

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值