C语言—结构体的声明,变量定义和初始化,传参

目录

一 结构体的声明

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

三 结构体传参


一 结构体的声明

 

数组:一组相同类型元素的集合

结构体: 其实是一组不一定相同类型元素的集合

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

//声明结构体类型
struct Stu
{
       //成员变量,是用来描述结构体对象的相关属性的
       char name[20];
       int age;
       char sex[5];//男 女  保密
} s2,s3,s4; //s2,s3,s4 就是结构体变量 - 全局变量(大括号外面)也可以不用创建

typedef struct Stu//类型重命名
{
       //成员变量,是用来描述结构体对象的相关属性的
       char name[20];
       int age;
       char sex[5];//男 女  保密
} Stu;//把这个结构体类型重新娶了一个名字 叫Stu

int main()
{
       //int a = 10;
       struct Stu s1;//局部变量 这里创建变量才能使用 
       Stu s2;// 在C语言中 没有对结构体类型typedef struct关键字不能省略

       return 0;
}
struct S
{
       int a;
       char arr[5];
       int* p;
}s1 = {100, "bit", NULL};//初始化

struct S s2 = {98, "hehe", NULL};//初始化

struct B
{
       char ch[10];
       struct S s;//嵌套
       double d;
};

int main()
{
       struct S s3 = {.arr = "abc", .p = NULL, .a = 1};//初始化 用.结构成员可以不用按照顺序
       printf("%d %s %p\n", s3.a, s3.arr, s3.p);//. 结构成员访问操作符
       struct B sb = { "hello", {20, "qqq", NULL}, 3.14};//必须按照顺序
       printf("%s %d %s %p %.2lf\n", sb.ch, sb.s.a, sb.s.arr, sb.s.p, sb.d);

       return 0;
}

 

#include <string.h>

struct Stu
{
       char name[20];
       int age;
};

void set_stu(struct Stu t)
{
       t.age = 20;
       //t.name = "张三";//err name 是数组 传过来需要指针接收 
       strcpy(t.name, "张三");//字符串拷贝
}

void print_stu(struct Stu t)
{
       printf("%s %d\n", t.name, t.age);
}

int main()
{
       struct Stu s = {0};//初始化为0
       set_stu(s);
       print_stu(s);
       return 0;
}


方法二:
struct Stu
{
       char name[20];
       int age;
};

//void set_stu(struct Stu* ps)
//{
//     (*ps).age = 20;
//     strcpy((*ps).name, "张三");
//}

void set_stu(struct Stu* ps)
{
       ps->age = 20;//结构体指针->结构体成员
       //t.name = "张三";//err
       strcpy(ps->name, "张三");//字符串拷贝
}


void print_stu(struct Stu *t)
{
       printf("%s %d\n", t ->name, t->age);
}

int main()
{
       struct Stu s = { 0 };
       set_stu(&s);
       print_stu(&s);
       return 0;
}

三 结构体传参

struct S
{
       int data[1000];
       int num;
};
struct S s = { {1,2,3,4}, 1000 };
//结构体传参
void print1(struct S s)
{
       printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
       printf("%d\n", ps->num);
}
int main()
{
       print1(s);  //传结构体
       print2(&s); //传地址
       return 0;
}


/*首选print2函数。 原因: 函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,需要临时拷贝 结构体过大,参数压栈 的的系统开销比较大,所以会导致性能的下降。*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值