初识结构体

文章目录

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

目录

  • 结构体类型的声明
  • 结构体初始化
  • 结构体成员访问
  • 结构体传参

1. 结构体类型的声明

1.1 结构的基础知识

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

注:

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

1.2 结构的声明

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;

int main()
{
	//int a = 10;
	struct Stu s1;//局部变量
	Stu s2;
	
	return 0;
}

注:

c 复制代码
struct Stu
{
	//成员变量,是用来描述结构体对象的相关属性的
	char name[20];
	int age;
	char sex[5];//男 女 保密
};

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

	return 0;
}

1.3 结构成员的类型

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

c 复制代码
struct S
{
	int a;
	char arr[5];
	int* p;
};

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

int main()
{

	return 0;
}

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

c 复制代码
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};
	struct B sb = { "hello", {20, "qqq", NULL}, 3.14 };

	return 0;
}

2. 结构体成员的访问

  1. 结构体变量访问成员
c 复制代码
#include <stdio.h>

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;
}
  1. 结构体指针访问指向变量的成员

以下代码是有问题的:

c 复制代码
#include <string.h>

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

void set_Stu(struct Stu t)
{
	t.age = 20;
	//t.name = "张三";//err
	strcpy(t.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;
}

正确代码:

c 复制代码
#include <string.h>

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;//结构体指针->结构体成员
	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;
}

3. 结构体传参

c 复制代码
#include <stdio.h>

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;
}

上面的 print1 和 print2 函数哪个好些?

答案是:首选print2函数。

原因:

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

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

相关推荐
聚客AI13 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v15 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工17 小时前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农19 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了19 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo20 小时前
322:零钱兑换(三种方法)
算法
NAGNIP2 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法