c语言的结构体知识汇总

本文详细汇总了C语言中的结构体知识,包括声明结构体的不同方式、结构体的初始化、结构体数组、嵌套结构体、指向结构体的指针操作、结构体数组的指针操作以及如何通过指针和直接传递结构体变量作为函数参数。同时,还讨论了结构体中数组和指针的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c语言的结构体

声明结构体方式

//
// Created by Yakun on 2020/11/29.
//
//第一种创建结构体模型,声明变量:struct _person person;
struct _person{
    int age;
    char name[30];
};
//第二种在结构体模型上加上变量
struct _person{
    int age;
    char name[30];
}liming;
//第三种生成结构体模型的别名,声明变量Person person;
typedef struct _person{
    int age;
    char name[30];
}Person;

结构体初始化三种方式

typedef struct _person
{
  int age;
  char name[30];
}person;
int main()
{
    person person1={.age=10,.name="qwe"};
    person person2={12,"asd"};
//    直接赋值
    person2=person1;
}

结构体数组

typedef struct _person
{
  int age;
  char name[30];
}Person;
int main()
{
//    生成含有10个元素的数组,且每个元素都是一个Person类型的结构体
//    person[0]是第一个元素的结构变量
    Person person[10];
//    给成员赋值
    person[0].age=1;
    strcpy(person[1].name,"asd");

结构体嵌套结构体

typedef struct _student
{
    int grade;
    int id;
}Student;
typedef struct _person
{
  int age;
  char name[30];
  Student student;
}Person;
int main()
{
    Person person={
            3,
            "asd",
            {3,1001}
    };
}

指向结构体的指针

typedef struct _person
{
  int age;
  char name[30];
}person;
int main()
{
    person person1={.age=10,.name="qwe"};
//    结构体名不像数组名,可以表示地址,所以结构体地址要使用&来取得
    person *person2=&person1;
//    表示指针结构体的内部变量有两种方式,第一种是先将指针变成结构变量,*person2,然后在对结构变量取内部变量,注意加括号,因为‘.’优先级更高
//    第二种是直接用指针来指引,如->符号
    printf("%d,%s",(*person2).age,person2->name);

指向结构体数组

    person p[2]={
            {.age=10,.name="qwe"},
            {.age=11,.name="asd"}
    };
    person *p2=p;
    for (int i = 0; i <2 ; ++i) {
        printf("%d,%s",(p+i)->age,(p+i)->name);
        printf("\n");
    }
}

向函数传递结构 参数是指针

typedef struct _person
{
  int age;
  int money1;
  int money2;
  int total;
  char name[30];
}person;
void add_money(person *person1)
{
    person1->total=person1->money1+person1->money2;
}
int main()
{
    person person1={
            12,
            1000,
            2000,
            0,
            "asd"
    };
//    记得&,因为传的是地址,而结构体名不是地址
    add_money(&person1);
    printf("%d",person1.total);//结果是3000
//    如果参数是指针,则函数可以更改结构体的内容,如果不想更改,可以使用const限制,如void add_age(const person *person1)
}

向函数传递结构 参数是结构变量

double add_money(person person1)
{
    return person1.money1+person1.money2;
}
int main()
{
    person person1={
            12,
            1000,
            2000,
            0,
            "asd"
    };
    person1.total=add_money(person1);
    printf("%d",person1.total);//结果是3000
//   如果直接将结构体传入的话,编译器会根据person模板创建一个副本,所以在函数里面操作的是副本,如果返回类型是void的话,则对原结构体无影响,
//若要修改原结构体的话,则需通过返回值来修改,现在也可以直接返回结构体
//因为要生成结构一模一样的副本,所以内存开销要比传指针大的多
}

结构体中的数组和指针

struct names{
    char first[20];
    char last[20];
};
struct pnames{
    char *first;
    char *last;
};
int main(){
    struct names names1={"a1","b1"};
    struct pnames names2={"a2","b2"};
    printf("%s,%s\t",names1.first,names1.last);
    printf("%s,%s\t",names2.first,names2.last);
//    他们两个不同点是 数组是直接存在于结构体内部,即结构体要为数组分配内存
//    而指针在结构体中只是地址,所以结构体只需要为指针分配地址的内存就可以了,指向字面量等,但是有些情况下容易出现问题,指向位置不对
//    为了防止指针出现问题,即要为他分配内存空间,使用malloc
    names2.first=malloc(sizeof(char)*20);
    strcpy(names2.first,"asd");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值