C语言基础-结构体

参考清华大学软件学院 谌卫军   《c语言程序设计》课件

1、结构体的定义和使用

1.1、结构体的定义

形式1:
struct <结构体标记>
{

        类型名1    成员变量1;

        ......

        类型名n    成员变量n;        

};

形式2:

typedef struct 
{

        类型名1    成员变量1;

        ......

        类型名n    成员变量n;        

}<结构体类型名>

2、定义结构体变量

形式1:struct <结构体标记> 变量1,变量2,...;

形式2:<结构体类型名> 变量1,变量2,...;

例如1:

struct student_tag
{
    char ID[7];
    char name[20];
    char gender;
    int age;
    char phone[9];
    char addr[30];
};

typedef struct
{
    char ID[7];
    char name[20];
    char gender;
    int age;
    char phone[9];
    char addr[30];
}student_T;

定义1:struct student_tag x;

定义2:student_T x;
sizeof(x)= 72
定义3:struct student_tag
{
    char ID[7];
    char name[20];
    char gender;
    int age;
    char phone[9];
    char addr[30];
}x,y;

1.2、结构体变量的使用

访问方式:结构体变量名.成员变量名

student_T x;

strcpy(x.ID,"020449");
strcpy(x.name,"Zhang");
scanf("%c",&x.gender);
x.age = 19;
strcpy(x.phone,str);
scanf("%s",x.addr);

注意1:①不能直接比较两个结构体变量(==、!=);②不能用scanf/printf来输入或输出整个结构体变量;

注意2:①能够进行结构体变量的整体赋值,如student_T x,y;    y=x;②能够定义一个返回值类型为结构体类型的函数

2、结构体数组与指针

2.1、结构体数组

student_T stu[1000];或者是struct student_tag stu[1000];

2.2、结构体与指针

一种新的指针类型:基类型为结构体类型的指针类型。

StudentRecord_T x,*px;
...
px=&x;

如何访问x的成员变量:

①x.成员变量名,如:x.name,x.id;

②(*px).成员变量名,如:(*px).name,(*px).id;

③px->成员变量名,"->"称为指向运算符或箭头运算符,如:px->name,px->id

StudentRecord_T a[10];
StudentRecord_T *px;
...
px = a;

px指向a[0];
px+1指向a[1];
...
px+i指向a[i];

3、结构体作为函数参数

/*问题描述:已知一条直线的2个端点坐标,计算该直线的中点的坐标。*/

/*用一个结构体来描述一个点*/
typedef struct
{
    double x,y;
}point_T;

point_T midpoint(point_T pt1,point_T pt2);

void main()
{
    point_T a ={0.0,0.0},b={5.0,10.0},m;
    m = midpoint(a,b);
}

point_T midpoint(point_T pt1,point_T pt2)
{
    point_T mid;
    mid.x = (pt1.x + pt2.x)/2.0;
    mid.y = (pt1.y + pt2.y)/2.0;
    return(mid);
}
void main()
{
    point_T a = {0.0,0.0},b = {5.0,10.0},m;
    set_midpoint(&a,&b,&m);
}

void set_midpoint(point_T *pt1,point_T *pt2,point_T *mid)
{
    mid->x = (pt1->x + pt2->x)/2.0;
    mid->y = (pt1->y + pt2->y)/2.0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值