初识结构体

文章目录

  • 目录
    • [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函数。

原因:

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

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

相关推荐
少林码僧1 天前
2.30 传统行业预测神器:为什么GBDT系列算法在企业中最受欢迎
开发语言·人工智能·算法·机器学习·ai·数据分析
豆沙沙包?1 天前
2026年--Lc343-1926. 迷宫中离入口最近的出口(图 - 广度优先搜索)--java版
java·算法·宽度优先
CoderCodingNo1 天前
【GESP】C++六级考试大纲知识点梳理, (7) 栈与队列
开发语言·c++
edisao1 天前
六、 读者高频疑问解答 & 架构价值延伸
大数据·开发语言·人工智能·科技·架构·php
超级大福宝1 天前
【力扣200. 岛屿数量】的一种错误解法(BFS)
数据结构·c++·算法·leetcode·广度优先
独自破碎E1 天前
【动态规划=递归+记忆化存储】跳台阶
算法·动态规划
范纹杉想快点毕业1 天前
C语言实现埃拉托斯特尼筛法
c语言·开发语言
catchadmin1 天前
Laravel12 + Vue3 的免费可商用 PHP 管理后台 CatchAdmin V5.1.0 发布 新增 AI AGENTS 配置
开发语言·php
一颗青果1 天前
auto | 尾置返回类型 | decltype | using | typedef
java·开发语言·算法
郝学胜-神的一滴1 天前
何友院士《人工智能发展前沿》全景解读:从理论基石到产业变革
人工智能·python·深度学习·算法·机器学习