初识结构体

文章目录

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

原因:

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

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

相关推荐
小王不爱笑1325 小时前
IO 模型
开发语言·python
知我Deja_Vu5 小时前
【避坑指南】ConcurrentHashMap 并发计数优化实战
java·开发语言·python
AI+程序员在路上5 小时前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
2401_831824965 小时前
基于C++的区块链实现
开发语言·c++·算法
We་ct5 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
愣头不青5 小时前
238.除了自身以外数组的乘积
数据结构·算法
爱编码的小八嘎5 小时前
C语言完美演绎4-4
c语言
人工智能AI酱6 小时前
【AI深究】逻辑回归(Logistic Regression)全网最详细全流程详解与案例(附大量Python代码演示)| 数学原理、案例流程、代码演示及结果解读 | 决策边界、正则化、优缺点及工程建议
人工智能·python·算法·机器学习·ai·逻辑回归·正则化
WangLanguager6 小时前
逻辑回归(Logistic Regression)的详细介绍及Python代码示例
python·算法·逻辑回归
m0_518019486 小时前
C++与机器学习框架
开发语言·c++·算法