结构体实用小技巧(第一季)

大家好,我是教授.F

目录

首先是结构体的声明:

初始化结构:

访问成员结构:

访问结构体成员也可以用指针:

结构体与数组:

嵌套结构:

传递结构体

        传递结构体成员:

        传递结构的地址:

        传递结构:


本文以创建图书目录为例子进行展开。

首先是结构体的声明:

struct book{
   char title[maxtitle];
   char author[maxautl];
   float value;
};

该声明描述了一个float类型的变量和两个char类型(字符数组)的变量组成的结构。该声明并没有创建实际的数据对象,只是描述了对象由什么组成,我们通常把该声明叫为模板。

struct是一个关键字,book是一个标记。正有了这个标记,我们我们在写程序时就可以通过“book”来引用该结构。例如我们可以这样:struct book library;。这样会把library声明为一个使用book结构布局的结构变量。

花括号括起来的是结构体的成员。

对于结构体我们可以在后面添加一点细节:

struct book{
   char title[maxtitle];
   char author[maxautl];
   float value;
};
struct book library;

结构体布局声明完成,我们可以再声明一个使用book布局的结构变量,如:struct book library;

这样一来,结构体声明在外部,所有的函数就可以调用他了。

与此相反的是:

struct book{
   char title[maxtitle];
   char author[maxautl];
   float value;
   struct book library;
};

这样就表示结构声明置于一个函数的内部,只限与该函数内部使用。(形成一种递归)

从您提供的两段代码来看,第一段代码在定义结构体内部包含了一个名为"library"的结构体成员,而第二段代码则在结构体定义外部独立地定义了"library"结构体变量。下面是对这两段代码的结合使用的示例,以及相应的C语言书写:

#include <stdio.h>
#include <string.h>

#define maxtitle 100
#define maxautl 50

// 使用第一段代码定义的结构体
struct book1{
   char title[maxtitle];
   char author[maxautl];
   float value;
   struct book1 library;  // 内部包含同类型的结构体成员
};
// 使用第二段代码定义的结构体
struct book2{
   char title[maxtitle];
   char author[maxautl];
   float value;
};

// 定义结构体变量
struct book2 library2;  // 在结构体外部定义的结构体变量

int main() {
    // 使用第一段代码定义的结构体
    struct book1 novel1;
    strcpy(novel1.title, "The Great Gatsby");
    strcpy(novel1.author, "F. Scott Fitzgerald");
    novel1.value = 15.99;
    // 设置内部的library成员的值
    strcpy(novel1.library.title, "To Kill a Mockingbird");
    strcpy(novel1.library.author, "Harper Lee");
    novel1.library.value = 12.50;

    // 使用第二段代码定义的结构体
    struct book2 novel2;
    strcpy(novel2.title, "1984");
    strcpy(novel2.author, "George Orwell");
    novel2.value = 10.25;

    // 设置外部的library2结构体变量的值
    strcpy(library2.title, "The Catcher in the Rye");
    strcpy(library2.author, "J.D. Salinger");
    library2.value = 9.99;

    return 0;
}

在上述示例中,我们使用了分别使用了第一段和第二段代码定义的结构体来创建不同的书籍数据结构,并进行了一些简单的赋值操作。

对于结构体变量的声明,也可以紧贴着结构体来声明:

struct book{
 char title[maxtitle];
 char author[maxauthor];
 float value;
}library;

这样一来,library对应着`struct book1`类型的结构体对象,并且包含了`struct book1`类型的成员变量。这个结构体成员包含着同类型的结构体,因此可以用来创建一个自包含的数据结构,以表示图书馆中的书籍信息。

初始化结构:

      在结构体中变量之间的初始化有逗号隔开即可。

struct book library{
   "jiegouti","FZYjiaoshou",1000
};

访问成员结构:

         访问成员是由.来访问的。例如:library.value就可以访问结构体中value的值。虽然library是一个结构体,但是library.value是一个float的变量。所以我们可以想像float类型变量来使用一样。例如:scanf_s("%f",&library.value);在这里有一个小知识点:&的优先级比.高, 所以&(library.value)与&library.value一样。

结构数组:

         声明结构数组与声明数组相似:

struct book library[maxbooks];

如果maxbooks=3,那效果图如下:

                               title                              author                              value

library[0].titlelibrary[0].authotlibrary[0].value
library[1].titlelibrary[1].authotlibrary[1].value
library[2].titlelibrary[2].authotlibrary[2].value

访问结构数组就用这样的通式:library[0].title;

也有这样的情况:library[0].title[3];这样就表示title的第四个元素了。

访问结构体成员也可以用指针:

#include<stdio.h>
struct book{
   char title[maxtitle];
   char author[maxautl];
   float value;
};

int main()
{

struct book fellow[2]=
{
  {"jiaoshuo1","FZY",1000},
  {"jiaoshuo2","FZY",2000}
}

struct book *hit;
hit=&fellow[0];
printf("%p,%p",hit,hit+1);


  return 0;
}

        

结构体与数组:

                 在这里我给出一道例题:

关于这道题,就可以用到结构体与数组的结合

下面的代码与下方的有点区别,目的是告诉读者,数组与结构体有多种声明方式

#include<stdio.h>
int main()
{
  struct student
{  
  int sex;
  char name[100];
};

int main()
{
  int n=10;
  struct student detail[n];
  for(int i=0;i<n;i++)
    {
        scanf("%d %s",&detail[i].sex,detail[i].name);
        //通过.来访问结构体的成员->sex和name
    }
  return 0;
}

以下就是题解了:

#include<stdio.h>
typedef struct student
{
	int sex;
	char name[9];
} detail;
int main(void)
{
	int n,m;
	scanf("%d",&n);
	m = n - 1;
	int i,j = 0,k = 0,sex = 0;
	detail devide[50];
	for(i = 0;i < n;i++)
	{
		scanf("%d %s",&devide[i].sex,devide[i].name);
	}	
	for(i = 0;i < n / 2;i++)
	{
		sex = 1 - devide[i].sex;
		for(j = m;j >= 0;j--)	//与第一个for循环成相反  让成绩好的跟差的组成一队
			if(devide[j].sex == sex)
			{
				printf("%s %s\n",devide[i].name,devide[j].name); 
				//找到后删除该元素 
				for(k = j;k < m ;k++)  //注意这里k=j并不能执行删除,因为要满足k<m;
                 {
					devide[k] = devide[k + 1];
                    //这里类似与链表,将该位置让给下一个元素。
                    //大家可以去看看我之前的文章,下方就是文章的链接
                 }
				m -= 1;
				break;
			}		
	}
	return 0;	
 } 

嵌套结构:

            所谓的嵌套,就是一个结构体包含另一个结构体

            那嵌套有什么好处呢?其实最主要的就是构建一个数据结构。

           例如,一个公司有名称,有公司年龄,有员工信息。那一名员工有名字,有年龄,有工资。

像这种情况,就可以用嵌套结构,请看下方代码:

#include<stdio.h>
struct Employee
{
  char name[50];
  int age;
  double salary;
}
 
struct Company
{
  char name[50];
  int numEmployee;
  struct Employee number[100];//这里就进行嵌套
}
int main()
{
  struct newCompany={ {jiaoshou.F,"3",
     {jiaoshou.F001,15,10000},
     {jiaoshou.F002,21,20000},
     {jiaoshou.F003,30,40000},}
//这里的结构体,输入数据的时候,其实就用到两个结构体了。

//打印公司信息
    printf("%s",newCompany.Comployeename);
    printf("%d",newCompany.ComployeenumEmployee);

//打印员工信息
for(int i=0;i<newComployee.numEmployee)
{
    printf("%s",newCompany.Employee.name[i]);
    printf("%d",newCompany.Employee.age[i]);
    printf("%lf",newCompany.Employee.salary[i]);
}

  return 0;
}

传递结构体

       对这部分的讲解,我就直接用代码讲了,因为直接写代码比大白话理解更深。

        传递结构体成员:

                        

#include<stdio.h>
#define FUNDIED 50
struct funds 
{
  char bankfund[FUNDIED];
  double bankfund;
  char savefund[FUNDLED];
  double savefund;
};

double sum(double,double);

int main(void)
{
  struct funds stan
{
  "FZY->bank",
   8888,
  "jiaoshou.F",
   9999
};
 printf("%.2f",sun(stan.bankfund,stan.savefund));
 return 0;
}
 
double sum(double x,double y)
{
 return (x+y);
}

//这段代码的灵感来源于财务系统;
//这段代码的主要功能是将该人的银行卡账户分别添加到bankfund和savefund中
//实现了传递结构体成员

      

        传递结构的地址:

#include<stdio.h>
#define FUNDIED 50
struct funds 
{
  char bankfund[FUNDIED];
  double bankfund;
  char savefund[FUNDLED];
  double savefund;
};

double sum(const struct funds *);

int main(void)
{
  struct funds stan
{
  "FZY->bank",
   8888,
  "jiaoshou.F",
   9999
};
 printf("%.2f",sum(&stan));//将地址进行传输
 return 0;
}

double sum(const struct funds *money)
{
   return (money->bankfund+money->savefund);
}

        传递结构:

#include<stdio.h>
#define FUNDIED 50
struct funds 
{
  char bankfund[FUNDIED];
  double bankfund;
  char savefund[FUNDLED];
  double savefund;
};

double sum(struct funds moolah);

int main(void)
{
  struct funds stan
{
  "FZY->bank",
   8888,
  "jiaoshou.F",
   9999
};
 printf("%.2f",sum(stan));
 return 0;
}

double sum(struct funds moolah)
{
   return (moolah.bankfund+moolah.savefund);
}

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
结构(struct)是C语言中一种用户自定义的数据类型,它可以将多个不同类型的变量打包成一个整结构),从而方便地操作这些变量。在单片机开发中,结构也被广泛应用,可以用来表示各种硬件设备的寄存器和状态信息等。下面是几个使用结构技巧: 1. 定义结构时要注意变量的顺序,因为它们在内存中的存储顺序就是按照定义的顺序排列的。 2. 在访问结构成员变量时,可以使用“点号”(.)来引用,也可以使用“箭头”(->)来引用。当使用指针来引用结构时,必须使用箭头运算符。 3. 可以使用typedef关键字来为结构定义别名,从而简化代码。 4. 结构的成员变量可以是基本数据类型,也可以是其他结构类型。这样可以创建嵌套结构,方便地组织和管理复杂的数据。 5. 在定义结构时,可以使用位域(bit-field)来指定每个成员变量所占据的位数,从而优化内存空间的使用效率。 6. 在使用结构时,要注意内存对齐的问题。结构的大小和布局可能受到编译器和处理器的影响,需要仔细考虑。 7. 可以使用结构数组来表示多个相似的设备或状态信息,从而方便地进行批量操作。 总的来说,结构是一个非常有用的数据类型,可以用来组织和管理复杂的数据结构,提高程序的可读性和可维护性。在单片机开发中,熟练掌握结构的使用技巧,能够大大提高代码的效率和质量。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值