C语言申明结构体的几种方式


文章主体来源自:C语言结构体与结构体指针的使用

C语言结构体与结构体指针的使用

C语言结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合。说得通俗一点就是一个集合。c语言是一门面向过程的编程语言,而结构体的使用在某些层次上跟面向对象有异曲同工之妙。

一、结构体变量的定义和初始化

1、首先我们来看一下结构体的定义
struct 结构体名
{
    成员列表;
};
// 结构体的定义
struct Student
{
    int num;
    char *name;
    char *sex;
}
// 与原文区别:原文这里采用的name[20]和sex来直接标识结构。这里采用了指针来标识。

注意:这里需要区别一下结构体名和变量名,结构体名是一种类型,不能被当成变量名来使用。

变量名声明方法:

  1. struct 结构体名 结构体变量名;
  2. 直接在定义结构体的时候添加变量名的声明。
   struct Student st1 = {1001,"kirito","m"};
   printf("num:%d, name:%s, sex:%s",st1.num,st1.name,st1.sex); // --> num:1001, name:kirito, sex:m
struct Student
{
    int num;
    char *name;
    char *sex;
}st1 = { 1001,"kirito","m" };
int mian(){
    printf("num:%d, name:%s, sex:%s",st1.num,st1.name,st1.sex); // --> num:1001, name:kirito, sex:m
    return 0;
}
2、结构体数组的定义及初始化
struct Student
{
    int num;
    char name[20];
    char sex[2];
};
// 与原文区别:由于C语言并不会自动分配空间,所以在自动初始化的时候,为了方便,没有采用指针的方式,而是采用了固定空间的数组的方式来处理。
int main()
{
    struct Student stuarr[3]; // 定义结构体数组
    // 循环初始化
    int num;
    for (num = 0; num < 3; num++)
    {
        scanf("%d %s %s", &stuarr[num].num, stuarr[num].name, stuarr[num].sex);
    }
    // 输出
    for (num = 0; num < 3; num++)
    {
        printf("num:%d, name:%s, sex:%s\n", stuarr[num].num, stuarr[num].name, stuarr[num].sex); // -->
    }
    return 0;
}

注意:以下内容节选自scanf写入字符串给指针

C语言是比较低级的语言,没有字符串概念,只有字符数组,不能自动分配空间,要存放数据,必须预先定义存储空间的大小!
改为:char name[100]; 一定要常量
scanf("%d%s",&a[i].nu,a[i].name); 就没问题了!
估计你曾经看过这种定义法:char *name=“abcd”;这种也是字符数组初始化固定的空间4个,所以你要记住,初始化一定要预定存放的空间大小!
还有你想达到高级语言的效果,你也可以用
a[i].name = (char *)malloc(100); /这里也要常量/
scanf("%d%s",&a[i].nu,a[i].name); 就没问题了!

二、结构体指针的使用

1、结构体指针的定义方法
  1. struct 结构体名 *指针;
  2. 直接在定义结构体的时候添加结构体指针的声明。
struct Student *stup;
struct Student 
{
    int num;
    char *name;
    char *sex;
} *stup;
2、利用结构体指针的访问结构体变量(输出)

结构体指针的访问变量方法

  1. p->结构体成员
  2. (*p).结构体成员
struct Student
{
    int num;
    char *name;
    char *sex;
};
int main()
{
    // 指针访问
    struct Student st1 = {1001, "kirito", "m"};
    struct Student *stup;
    stup = &st1;
    printf("num:%d, name:%s, sex:%s\n", stup->num, stup->name, stup->sex); // --> num:1001, name:kirito, sex:m
    return 0;
}
struct Student
{
    int num;
    char *name;
    char *sex;
};
int main()
{
    // 指针访问
    struct Student st1 = {1001, "kirito", "m"};
    struct Student *stup;
    stup = &st1;
    printf("num:%d, name:%s, sex:%s\n", (*stup).num, (*stup).name, (*stup).sex); // --> num:1001, name:kirito, sex:m
    return 0;
}
练习
  1. p-> num++
  2. p++->num
struct Student
{
    int num;
    char *name;
    char *sex;
};
int main()
{
    // 指针访问
    struct Student st1 = {1001, "kirito", "m"};
    struct Student *stup;
    stup = &st1;
    int num = stup->num++;
    printf("tmpnum:%d, num:%d, name:%s, sex:%s\n",num , stup->num, stup->name, stup->sex); // -> tmpnum:1001, num:1002, name:kirito, sex:m
    return 0;
}
struct Student
{
    int num;
    char *name;
    char *sex;
};
int main()
{
    // 指针访问
    struct Student st1[2] = {1001, "kirito", "m",1003,"asna","l"};
    struct Student *stup;
    stup = st1;
    int num = stup++->num;
    printf("tmpnum:%d, num:%d, name:%s, sex:%s\n",num , stup->num, stup->name, stup->sex); // -> tmpnum:1001, num:1003, name:asna, sex:l
    return 0;
}

声明:一代明君的小屋|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - C语言申明结构体的几种方式


欢迎来到我的小屋