浅谈结构体

一、首先为什么会出现结构体呢?(这个问题得弄明白,学习的时候,要有打破砂锅问到底的精神,自己要多问个为什么是这样,把别人的东西变成自己的知识点)

在我们学习c语言的时候,,我们一般都会见到基本数据类型:int     char      float    double等等,但是在表示一些复杂的的数据,显然所学的基本数据类型是不够了,所以这个时候我们就引入结构体这种新的数据类型,来满足开发需要。

二、什么是结构体?

1、  简单的来说,结构体就是用户根据实际需求来定义自己的复合数据类型,我们还是来看一个例子:

 1 #include <stdio.h>
 2
 3 //这里定义了一个一个新的数据类型为strcut Student ,并且这个结构体里面有三个成员,第一个占内存4个字节,第二个200个字节,第三个4个字节
 4 struct Student
 5 {
 6     int sid;
 7     char name[200];
 8     int age;
 9 };//注意这里这个分号不要忘了写
10
11
12 int main(void)
13 {
14     //定义了一个数据类型为struct Student变量,名为st
15     struct Student st={1000, "haha",20
16     };
17     //这里我们通过"." 来访问结构体里面的成员
18     printf("%d %s %d\n", st.sid, st.name, st.age);
19     return 0;
20
21 }

运行结果如下:

2、接下来显示另外一种赋值方式,还是来看例子:

 1 #include <stdio.h>
 2 #include <string.h>
 3 struct Student
 4 {
 5     int sid;
 6     char name[200];
 7     int age;
 8 };
 9 int main(void)
10 {
11
12     struct Student st={1000, "haha",20
13     };
14     printf("%d %s %d\n", st.sid, st.name, st.age);
15     //这里通过“.”访问结构体成员来进行赋值,其实和上面差不多,只不过形式不一样而已
16     st.sid=99;
17     strcpy(st.name,"lisi");//注意这里不能这样对字符类型的结构体成员赋值,st.name="lisi",这样会报错,我们只能用字符串函数strcpy()来进行连接字符串
18     st.age=21;
19     printf("%d %s %d\n", st.sid, st.name, st.age);
20     return 0;
21
22 }

运行效果如下:

3、通过指针来访问结构体成员,为啥要这样呢;因为通过上面那种方式访问的话,它占用内存空间大(它至少要占用208个字节),会导致程序在运行的时候,效率低,好资源,所以呢,我们我接下来用指针来访问结构体成员,这样做,相对于刚才那种访问方式来说,它不耗内存资源(它只占用4个字节),运行效率高;好了我们来看例子吧。

 1 #include <stdio.h>
 2 #include <string.h>
 3 struct Student
 4 {
 5     int sid;
 6     char name[200];
 7     int age;
 8 };
 9 int main(void)
10 {
11
12     struct Student st={1000, "haha",20
13     };
14      //这里定义了一个struct Student 类型的指针变量pst
15     struct Student * pst ;
16     pst=&st;
17     pst->sid=99;    //注意*pst=st,所以(*pst).sid等价于st.sid,所以pst->sid等价于st.sid
18     strcpy(pst->name,"lisi");
19     pst->age=21;
20     printf("%d %s %d\n",pst->sid,pst->name,pst->age);
21
22     return 0;
23
24 }

运行结果如下,我们可以看到和上面那种方式访问运行的结果一样:

三、普通结构体变量和结构体变量做为函数形参来传递:

我们还是来看一段代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 struct Student
 4 {
 5     int sid;
 6     char name[200];
 7     int age;
 8 };
 9 void f(struct Student * pst);
10 int main(void)
11 {
12     struct Student st={1000, "haha",20
13     };
14      //调用f()这个函数,注意这个形参是要传递地址的
15     f(&st);
16     printf("%d %s %d\n",st.sid,st.name,st.age);
17     return 0;
18 }
19 void f(struct Student * pst)
20 {
21     (*pst).sid=99;
22     strcpy(pst->name,"lisi");
23     pst->age=21;
24 }

接着我们还可以对输出再进行函数包装输出:

 1 #include <stdio.h>
 2 #include <string.h>
 3 struct Student
 4 {
 5     int sid;
 6     char name[200];
 7     int age;
 8 };
 9 void f(struct Student * pst);
10 void g(struct Student st);
11 int main(void)
12 {
13     struct Student st={1000, "haha",20
14     };
15
16     f(&st);
17     g(st);
18     return 0;
19 }
20 void g(struct Student st)
21 {
22      printf("%d %s %d\n",st.sid,st.name,st.age);
23 }
24 void f(struct Student * pst)
25 {
26     (*pst).sid=99;
27     strcpy(pst->name,"lisi");
28     pst->age=21;
29 }

最终输出的结果是:

四、总结:

1、结构体两种访问方式:

struct Student st ={10000,"lisi",20};

struct Student * pst;

a:

st.sid

b:

pst->sid  (pst 所指向的结构体变量中的sid 这个成员

2、使用第一种访问方式比第二种指针访问访问效率低了很多,因为第一种方式它耗用大量的内存资源。

原文地址:https://www.cnblogs.com/1121518wo/p/10884219.html

时间: 2024-10-07 22:06:03

浅谈结构体的相关文章

浅谈结构体如何分配内存

今天把操作符sizeof用了个遍,各种类型基本都用了,最后发现结构体类型最麻烦.下面直接进入主题: (1)先是定义了如下结构体: struct{            char a;            int i;            double d;            }text; 然后用sizeof(text),预期结果是1+2+8 = 11???如果这样想就错了,答案是16. (2)然后,换一下变量的顺序: struct{            char a; double d

浅谈c语言typedef 与结构体指针(个人小经验)

 #include<stdio.h> #include<string.h> typedef struct emp{ char sex[8]; char name[15]; int age; }*emp;//这里我们用typedef把emp这个结构体变成了*emp这种指向结构体成员的结构体指针 /*typedef struct emp{ char sex[8]; char name[15]; int age; }pi,*emp;//为了程序的可读性最好不要这样声明*/ int m

浅谈C语言中结构体的初始化

转自:http://www.jb51.net/article/37246.htm <代码大全>建议在变量定义的时候进行初始化,但是很多人,特别是新人对结构体或者结构体数组定义是一般不会初始化,或者不知道怎么初始化.1.初始化 复制代码代码如下: typedef struct _TEST_T {        int i;        char c[10];}TEST_T;TEST_T gst  = {1, “12345”};//可以初始化,设置i为1,s为一个字符串.TEST_T gst 

浅谈c++中结构体和共用体的区别

在c++中,结构体(struct)和共用体(union)是两种很相似的复合数据类型,都可以用来存储多种数据类型,但是两者还有很大的区别. 结构体(struct) 结构是用户自定义的类型,比数组更灵活,同一个结构可以存储多种类型的数据. 结构的创建包括两步,首先定义结构描述---描述并标记了能够存储在结构中的各种数据类型. struct  shoes { char name[20]; int size; double price; }; 下面就可以按描述创建结构变量. shoes sport; [

关系型数据库表结构设计规范-浅谈(转)

数据库表结构设计规范-浅谈,为啥是浅谈呢,因为主要的观点还是来自原微信公共账号的一篇文章,稍微加了一些自己的看法. 谁来进行数据库的设计? 肯定是具体的开发工程师来进行,开发同学的话,第一业务熟悉度比较高,第二结合OO和ORM的思想,能有比较好的运用关系型数据库的特性.如果是DBA同学的话,虽然对于数据库本身了解比较多,但是对于业务了解较少,很难有比较客观的设计.但是业务上线或者运行期间,需要DBA同学能够重度的加入进来,针对一些性能点和不合理的点进行优化,同事也可以在上线前,针对SQL进行re

【Go语言】【13】再谈GO语言的结构体

本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初始化后的结构体赋值给其它变量,例如: /*声明结构体*/ type employee struct{ name,address string height,weight float64 } /*初始化结构体,并赋给变量emp*/ emp := employee{name:"eagle",

浅谈swift中的那些类,结构以及初始化的操作

首先呢,我们先声明一个类 class Parent { //声明一个属性 var p1: String = "abc" //声明一个方法 func m() { print("parent m") } //声明一个静态的方法 final func n(){ } } 然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new 一个的话, 直接调用该类就可以了) var par = Parent() 调用parent的方法和属性 par.m()

浅谈java中循环结构之一——————while的简单应用

1.什么是循环? 有时您希望代码在工作完成之前反复做同一件事.可使用循环 实现此目的.循环是一种编程结构,它在满足某个特定条件(或某组条件)时反复执行.循环结构就是为了解决重复代码或者是有规律的代码. 2.今天先简单谈谈while的简单应用 先谈谈while循环的三要素 while循环的三要素:(1)初始化变量(2)循环条件(3)改变循环变量的值 当你要用while循环时主要知道这三个要素什么,那么循环起来就得心应手了. 下面是while循环语法和特点:                    

浅谈C/C++结构体内存分配问题

.wiz-todo, .wiz-todo-img {width: 16px; height: 16px; cursor: default; padding: 0 10px 0 2px; vertical-align: -10%;-webkit-user-select: none;} .wiz-todo-label { display: inline-block; padding-top: 7px; padding-bottom: 6px; line-height: 1.5;} .wiz-todo