当前位置: 首页 > news >正文

初阶C语言——结构体【详解】

文章目录

  • 1. 结构体的声明
    • 1.1 结构的基础知识
    • 1.2 结构的声明
    • 1.3 结构成员的类型
    • 1.4 结构体变量的定义和初始化
  • 2. 结构体成员的访问
  • 3. 结构体传参

1. 结构体的声明

1.1 结构的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

1.2 结构的声明

struct tag
{member-list;
}variable-list;

例如描述一本书:
第一种写法

struct Book
{//成员变量char name[20];//名字int price;//价格
};//分号不能丢

第二种写法

struct Book
{char name[20];int price;
}b1,b2,b3;//变量

第三种写法

typedef struct Book//typedef对类型重命名
{char name[20];int price;
}Book;

1.3 结构成员的类型

结构的成员可以是标量、数组、指针,甚至是其他结构体。

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

看代码:

#include <stdio.h>
struct S
{char c;char arr[10];int* p;
}s1, s2; // 声明类型的同时定义变量s1,s2struct S s3;//全局变量struct B
{int a;struct S s;double d;
}sb1, sb2;struct B sb3;int main()
{//初始化:定义变量的同时赋初值struct S s4 = {'c', "zhangsan", NULL};//局部变量,并对其初始化int a = 10;struct B sb4 = { 100, {'q', "lisi", &a}, 3.14};return 0;
}

2. 结构体成员的访问

  • 结构体变量访问成员
    结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
    例如:
#include <stdio.h>
struct Book
{char name[20];int price;
};
int main()
{struct Book b1 = { "C结构体",66 };struct Book b2 = { .price = 88,.name = "C++" };//结构体变量.结构体成员printf("%s %d\n", b1.name, b1.price);printf("%s %d\n", b2.name, b2.price);return 0;
}
  • 结构体指针访问指向变量的成员
    有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。
    那该如何访问成员。
    如下:
#include <stdio.h>
struct Stu
{char name[20];int age;
};
void print(struct Stu* ps)
{printf("name = %s age = %d\n", (*ps).name, (*ps).age);//使用结构体指针访问指向对象的成员printf("name = %s age = %d\n", ps->name, ps->age);
}
int main()
{struct Stu s = { "zhangsan", 20 };print(&s);//结构体地址传参return 0;
}

3. 结构体传参

看代码:

#include <stdio.h>
struct S
{int arr[100];int n;
};
//结构体传参
void print1(struct S ss)
{int i = 0;for (i = 0; i < 10; i++){printf("%d ", ss.arr[i]);}printf("\n%d\n", ss.n);
}
//结构体地址传参
void print2(struct S* ps)
{int i = 0;for (i = 0; i < 10; i++){printf("%d ", ps->arr[i]);}printf("\n%d\n", ps->n);
}int main()
{struct S s = { {1,2,3,4,5}, 100 };print1(s);//传结构体print2(&s);//传地址return 0;
}

上面的 print1 和 print2 函数哪个好些?
答案是:首选print2函数。
原因:

函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的 下降。

结论:
结构体传参的时候,要传结构体的地址

http://www.lryc.cn/news/20163.html

相关文章:

  • 盘点:9款身份和访问管理工具
  • Linux下的进程地址空间
  • Web Spider Ast-Hook 浏览器内存漫游 - 数据检索
  • 开源启智,筑梦未来!第四届OpenI/O启智开发者大会开幕
  • CS144-Lab6
  • 最好的个人品牌策略是什么样的
  • 第四届国际步态识别竞赛HID2023已经启动,欢迎报名
  • 「2」指针进阶——详解
  • 计网笔记 网络层(端到端的服务)
  • [蓝桥杯 2018 省 B] 日志统计——双指针算法
  • SpringMVC请求转发和重定向
  • 如何建立项目标准化评价体系?【锦狸】
  • Vue基础入门讲义(二)-语法基础
  • 应广单片机用8位乘法器实现16位乘法运算
  • Android中使用GRPC简明教程
  • 【Linux】使用U盘自动化安装Linux(VMware虚拟机)
  • 内网渗透(五十七)之域控安全和跨域攻击-基于服务账户的非约束委派攻击
  • gitlab 安装到项目上传一篇解决
  • Verilog 逻辑与()、按位与()、逻辑或(||)、按位或(|)、等于(==)、全等(===)的区别
  • 剑指 Offer 22. 链表中倒数第k个节点
  • 数据结构预算法之买卖股票的最好时机(三)动态规划
  • 【数通网络交换基础梳理2】三层设备、网关、ARP表、VLAN、路由表及跨网段路由下一跳转发原理
  • Java-排序链表问题
  • c++之二叉树【进阶版】
  • 【数据库】 SQLServer
  • Linux 4.19 内核中 spinlock 概览
  • TensorFlow 1.x学习(系列二 :1):基本概念TensorFlow的基本介绍,图,会话,会话中的run(),placeholder(),常见的报错
  • javaEE 初阶 — 关于 IPv4、IPv6 协议、NAT(网络地址转换)、动态分配 IP 地址 的介绍
  • 《Qt 6 C++开发指南》简介
  • CleanMyMac是什么清理软件?及使用教程