首页 > 其他分享 >初阶结构体

初阶结构体

时间:2024-08-19 20:26:54浏览次数:14  
标签:初阶 struct int age name stu 结构

目录

1.结构体声明

1.1结构体基础知识

1.2结构体的声明

1.3 结构成员的类型

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

1.41结构体变量的定义

1.42结构体变量的初始化

2.结构体访问

2.1(.)点操作符

2.2(->)箭头操作符

3.结构体传参


1.结构体声明

1.1结构体基础知识

我们先了解一些概念:

数组:数据的集合,但是每个数据的类型都相同

结构(结构体):也是一些数据的集合,但每个成员可以是不同类型

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

1.2结构体的声明

struct是声明这圣一个结构体

tag是这个结构体的名字

member-list是结构体的成员列表

variable-list是结构体的变量列表

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

 为什么要出现结构体?

我们当前学习的类型都是内置类型

int ,char,short,int,double这些都可以用来描述一个简单的对象

但是我们如果要描述一个复杂对象,比如人,我们就需要更多的类型

人:名字(name)+性别(gender)+年龄(age)+地址(adress)+电话(phone)……

 我们假如存入学生的信息,我们就可以创建一个结构体

struct stu
{
    //学生的相关属性
	char name[20];//名字
	int age;//年龄
	char gender[20];//性别
};

1.3 结构成员的类型

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

struct	B 
{
	char c;
	int i;
};

struct stu
{
	char name[20];
	int age;
	int arr[10];
	double* pd;
	struct	B a;
};

 

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

1.41结构体变量的定义

我们之前学习存入一个数据,例如:

int a  = 10;

 我们是先有类型,然后有名称(这时计算机会在内存中开辟这个类型大小的空间,这个空间会被命名成我们给定的名字),最后才能往空间内存入我们的数据;

int 就是类型,a就是名称,10是存入的数据。

那么结构体也是这样

我们需要先声明一个结构体类型,再创建变量最后才能存入数据

struct stu
{
	char name[20];
	int age;
	int arr[10];
	double* pd;
	struct	B a;
};
int main()
{//struct stu是类型
	struct stu s1;//s1是变量名称
	struct stu s2;//s2
	return 0;
}

 学生类型—>学生变量—>学生的属性信息—>存入信息

(有类型)  (变量名)(结构体内的信息)(存入)

这里我们是在主函数中创建的2个变量,我们也可以在结构体外直接声明变量名称

struct stu
{
	char name[20];
	int age;
	int arr[10];
	double* pd;
	struct	B a;
}s3,s4;//全局变量

struct stu s5;//全局变量

//s3 s4和s5是在函数外创建的变量所以他们是全局变量
//s1和s2是函数内的变量所以说局部变量


int main()
{
	struct stu s1;//局部变量
	struct stu s2;//局部变量
	return 0;
}

我们在函数内声明是结构体类型时,在c语言中必须加上,结构体类型和名称

int main()
{
    stu s1;//错误,编译器会报错
    struct stu s2;//正确写法
    return 0;
}

当然我们也可以使用typedef 重新定义这个结构体类型的名字

typedef struct stu
{
	char name[20];
	int age;
	int arr[10];
	double* pd;
	struct	B a;
}stu;

这样这个结构体变量的类型就被称为 stu 了

我们就可以直接,类型 + 类型变量;来创建这么一个变量了

int main()
{
	stu s1;
	struct stu s2;
	return 0;
}

当然我们还声明struct stu 也还是正确的。

1.42结构体变量的初始化

初始化和数组一样,我们都要用到大括号{ }

struct stu
{
	char name[20];
	int age;
	char gender[23];
    int* a;
};

int main()
{	// 按顺序来初始化
	struct stu s1 = { "zhangsan", 17, "nan" ,NULL};
	//按照指定成员来初始化
	struct stu s2 = {.gender = "nv",.age = 13, .name[20] = "erya",.a = NULL};
	return 0;
}

使用(.)操作符来进行指定成员的访问

struct stu
{
	char name[20];
	int age;
	char gender[23];
	int* a;
	int arr[3];
};

int main()
{	// 按顺序来初始化
	struct stu s1 = { "zhangsan", 17, "nan", NULL, {1,2,3} };
	//按照指定成员来初始化
	struct stu s2 = { .gender = "nv",.age = 13, .name[10] = "erya", .a = NULL, .arr = {1,2,3} };
	return 0;
}

 下面是一些初始化的例子

struct Point
{
	int x;
	int y;
}p1; //声明类型的同时定义变量p1


struct Point p2; //定义结构体变量p2
struct Point p3 = { 3, 4 };//初始化:定义变量的同时赋初值。

struct Stu
{
	char name[20];
	int age;
};
struct Stu s1 = { "zhangsan", 20 };//初始化


struct Node
{
	int data;
	struct Point p;
	struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

 

2.结构体访问

结构体访问用到2个操作符

(.)点操作符(->)箭头操作符

2.1(.)点操作符

(.)点操作符接收2个操作数:左边是结构体变量名字,右边是结构体内的参数名字

struct . 成员名

struct stu
{
	char name[20];
	int age;
}s1;
int main()
{
	s1.age = 13;
	return 0;
}

 当我们输入结构体类型名字的时候,加上(.)自动就知道我们要访问内容了。

2.2(->)箭头操作符

struct* -> 成员名

struct stu
{
	char name[20];
	int age;
}s1;
int main()
{
	struct stu* p = &s1;
	p->name;
	s1.age = 13;
	return 0;
}

 

 当我们有结构体的地址时,输入->就可以直接访问里面的成员了。

3.结构体传参

结构体传参时我们要牢记一点:我们结构体传参传过去地址。

下面我们来用一些例子解释一下。

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

p(struct stu s)
{
	printf("%d %s", s.age, s.name);
}
void set_(struct stu s)
{
	s.age = 18;
	//当我们想要修改一个字符串的内容时我们使用strcpy,因为字符串在内存中是常量
	strcpy(s.name,"lisi" );

}
int main()
{	//初始化结构体
	struct stu s = { 0, "n"};
	//我们写一个函数给s存入数据
	set_(s);//给age存入18,给name存入“lisi”
	//我们写一个函数打印这个结构体
	p(s);
	return 0;

}

我们运行结果发现是

发现并未修改,这是因为:

实参传给形参,形参是实参的一份临时拷贝,对与形参的修改,不影响实参

所以我们应当传给函数相应的地址,通过地址直接修改。

struct stu
{
	int age;
	char name[20];

};

p(struct stu* s)//(因为我们要传的是地址,我们接收应该用指针类型来接受)
{
	printf("%d %s", s->age, s->name);
}
void set_(struct stu* s)
{
	s->age = 18;
	//当我们想要修改一个字符串的内容时我们使用strcpy,因为字符串在内存中是常量
	strcpy(s->name, "lisi");

}
int main()
{	//初始化结构体
	struct stu s = { 0, "n" };


	//我们写一个函数给s存入数据
	set_(&s);//给age存入18,给name存入“lisi”
    //这时我们传过去的是指针了

	//我们写一个函数打印这个结构体
	p(&s);
	return 0;

}

我们来看打印结果

这样我们发现他的值确实被修改了。 

 此外还有要注意的点就是:

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

所以今后我们结构体传参时统一传其地址就可以了。

标签:初阶,struct,int,age,name,stu,结构
From: https://blog.csdn.net/2302_77268606/article/details/141273276

相关文章

  • MOSFET的基本结构与工作原理
    MOS栅结构是MOSFET的重要组成部分,一个典型的N沟道增强型结构示意图如图1所示。其中栅极、源极和漏极位于同一个平面内,半导体的另一个平面可以称为体端,所以在一些书籍和资料中,也将MOSFET称为四端器件,实际上那个体端一般跟源极相连接,所以在此还是将MOSFET看成三端器件。N沟道增强......
  • lg根号数据结构
    根号数据结构序列分块通过将序列分成小段,整块标记,不足整块的暴力,以平衡修改查询的复杂度。如果两个操作的调用次数有较大差异,可以使用分块维护更多/更少信息来平衡两边的时间复杂度。请注意并非选择“更快”的数据结构就更好,比如树状数组看似更平衡,但是修改和询问的次数不平衡......
  • TCPIP路由技术第一卷第八章OSPF 第二部分-1接口结构和接口状态机
    tcp/ip_ospf案例研究一r2:inte1/0ipospf110area0r3:inte1/0ipospf110area0r2:showipospfneighborauto-costreference-bandwidth更改缺省的参考带宽.在一个ospf域建议配置一致.inftransdelay:这个信息是指lsa从路由器的接口发送后经历的时间,以秒数计算,......
  • 数据结构与算法——滑动窗口
    目录引言核心思想使用场景解题步骤经典例题1、无重复字符的最长子串(LeetCode3)2、找到字符串中所有字母异位词(LeetCode438)引言定义:滑动窗口是指通过左右两个指针(或索引)来标记窗口的左右边界,随着指针的移动,窗口内的元素不断变化,从而实现对数组或字符串中连续子序列的......
  • CPU的功能和基本结构
    1.CPU的功能①指令控制完成取指令、分析指令和执行指令的操作,即程序的顺序控制。 ②操作控制一条指令的功能往往是由若干操作信号的组合来实现的。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件从而控制这些部件按指令的要求进行动作。 ③......
  • 算法与数据结构——空间复杂度
    空间复杂度空间复杂度(spacecomplexity)用于衡量算法占用内存空间随着数据量变大时的增长趋势。这个概念与时间复杂度非常类似,只需将“运行时间”替换为“占用内存空间”。 算法相关空间算法在运行过程中使用的内存空间主要包括以下几种。输入空间:用于存储算法的输入数据。......
  • 【数据结构】详细介绍栈和队列,解析栈和队列每一处细节
    目录一.栈1. 栈的概念2. 栈的实现2.1栈的结构2.2初始化栈2.3入栈2.4出栈2.5获取栈顶元素2.6获取栈中有效个数2.7判断栈是否为空2.8销毁栈 二.队列1.队列的概念2.队列的实现 2.1队列的结构2.2队列初始化 2.3销毁队列 2.4入队列(队尾) ......
  • 算法与数据结构——时间复杂度
    时间复杂度运行时间可以直观且准确地反映算法的效率。要准确预估一段代码的运行时间,应该进行如下操作。确定运行平台,包括硬件配置、编程语言、系统环境等,这些因素都会影响代码的运行效率。评估各种计算操作的运行时间,例如加法操作需要1ns,乘法操作需要10ns,打印操作需要5ns等。......
  • 算法与数据结构——复杂度分析
    复杂度分析算法效率评估在算法设计中,我们追求以下两个层面的目标。找到问题解法:算法需要再规定的输入范围内可靠地求得问题的正确解寻求最优解法:同一个问题可能存在多种解法,我们希望找到尽可能高效的算法。也就是说,在能够解决问题的前提下,算法效率已经成为衡量算法优劣的主......
  • 数据结构(二)- 线性表
    数据结构(二)-线性表数据结构三要素——逻辑结构、数据的运算、存储结构;存储结构不同运算实现的方式不同;1.线性表的定义定义:线性表是具有相同数据类型的n(n>0)个数据元素的有限序列,其中n为表长,当n=0线性表是一个空表。一般表示为L=(a1,a2,…,ai,ai+1,…,an)......