一文读懂c语言结构体在单片机中的应用

Struck

看到单片机中有很多struck 的应用,但是呢我当初学C语言的时候又没有很认真的去学习,今天复习下,写一篇小小的交流,希望能够给大家带来帮助。

1.struck的定义

/***********方式一**********/
struct Book
	{
		char title[128];
		char aurhor[40];
		float price;
		unsigned int date;
		char pubilsher[40];
	};
/*定义了Book这个模板*/
struct Book book1,book2,book3;//使用struct Book这个模板建立了一个book1变量

/***********方式二**********/
struct Book
	{
		char title[128];
		char aurhor[40];
		float price;
		unsigned int date;
		char pubilsher[40];
	}book1,book2,book3;
//和方式1的结果相同

2.struck调用

scanf(“%s”,book.title)//使用的.(点)运算符,表示book变量里的title属性
scanf(“%s”,&book.price)//数组不需要加取地址符,整型需要

3.struck的初始化

/********方式一*******/
struct Book book1
	{
		“小甲鱼带你学习带你飞”,
		“小甲鱼”,
		48.8,
		2017111111,
		“清华大学出版社”,
	};
/********方法二*******/
struct Book book1{.price=48.8	};//可以以这种方式定义多种数值

4.struck在单片机中的应用

好的,进入正题。复习了struck结构体的基本用法。也就是大家在课堂上学习的知识之后。我们在单片机的学习以及编译过程中是如何使用的呢。

void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOB_CLK_ENABLE();           	//开启GPIOB时钟
	__HAL_RCC_GPIOE_CLK_ENABLE();           	//开启GPIOE时钟

    GPIO_Initure.Pin=GPIO_PIN_5; 				//PB5
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  	//推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          	//上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);

	GPIO_Initure.Pin=GPIO_PIN_5; 				//PE5
	HAL_GPIO_Init(GPIOE,&GPIO_Initure);

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);	//PB5置1,默认初始化后灯灭
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);	//PE5置1,默认初始化后灯灭
}

这是一段led灯的初始化代码

(进入方式如下图,选中LED_Init,右键,Go to Defintion of xxxxxx)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mtUqVX8i-1622116136280)(Struck%20224c53c2d9e240c2af26d85e538af920/Untitled.png)]

我们来逐行分析这些代码

void LED_Init(void)
//空函数空返回值,定义了一个函数,函数的名字是LED_Init,空形参,空返回值
/***c语言函数部分**/

第一行很简单没什么问题,下一行GPIO_InitTypeDef GPIO_Initure;遇到问题了。看不懂

首先打开百度翻译翻译下这句话

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVa8PrbF-1622116136282)(Struck%20224c53c2d9e240c2af26d85e538af920/Untitled%201.png)]

大概就是GPIO初始化的意思。我们再次右键看下,第一个可能是个函数,将后面的这部分定义了。

typedef struct
{
  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
                           This parameter can be any value of @ref GPIO_pins_define */

  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref GPIO_mode_define */

  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
                           This parameter can be a value of @ref GPIO_pull_define */

  uint32_t Speed;     /*!< Specifies the speed for the selected pins.
                           This parameter can be a value of @ref GPIO_speed_define */
} GPIO_InitTypeDef;

还是和刚刚一样右键然后Go to Defintion of xxxxxx。我们来到了这里,但是全是英文。所以又要借助我们的老朋友了,百度翻译。

/************翻译之后的**************/
typedef struct
{
  uint32_t Pin;       /*指定要配置的GPIO引脚,此参数可以是@ref GPIO_pins_define中的值*/

  uint32_t Mode;      /*指定所选管脚的工作模式。此参数可以是@ref GPIO\u mode\u define的值*/

  uint32_t Pull;      /*指定选定接点的上拉或下拉激活。此参数可以是@ref GPIO\u pull\u define的值*/

  uint32_t Speed;     /*指定选定接点的速度。此参数可以是@ref GPIO\u speed\u define的值*/
} GPIO_InitTypeDef;

我们可以看到这里的用法与我们c语言中的struck有些类似,但是又有些许的不同。结果是一样的。

现说结论,他这里建立了一个 GPIO_InitTypeDef的模板。与下列的代码相似。或者说是结果相同

struct  GPIO_InitTypeDef
	{
		uint32_t Pin;    //uint32_t是定义了一个32位的变量,右键go to也能找到对应的位置
		uint32_t Mode;
		uint32_t Pull;
	  uint32_t Speed;
	};

/******************************/
/*******go to之后得到的内容*****/
//typedef unsigned          char uint8_t;           -->将unsigned char改名为uint8_t
//typedef unsigned short     int uint16_t;         -->将unsigned short int改名为uint16_t
//typedef unsigned           int uint32_t;          -->将unsigned int改名为uint16_t
//typedef unsigned       __INT64 uint64_t;          -->将unsigned __INT64改名为uint64_t
/***进行变化之后更方便我们使用时候选取适合字节数的变量名来定义****/

但是他这里用了一个typedef,相当于把这部分重命名了方便了我们以后的使用。对比下

/******使用纯粹的C语言编程*******/
struct  GPIO_InitTypeDef
	{
		uint32_t Pin;
		uint32_t Mode;
		uint32_t Pull;
	  uint32_t Speed;
	}GPIO_Initure;

//或者如下
struct  GPIO_InitTypeDef
	{
		uint32_t Pin;
		uint32_t Mode;
		uint32_t Pull;
	  uint32_t Speed;
	};
struct GPIO_InitTypeDef GPIO_Initure;
/********使用改进后的代码进行编程******/

typedef struct
{
  uint32_t Pin;       /*指定要配置的GPIO引脚,此参数可以是@ref GPIO_pins_define中的值*/
  uint32_t Mode;      /*指定所选管脚的工作模式。此参数可以是@ref GPIO\u mode\u define的值*/
  uint32_t Pull;      /*指定选定引脚的上拉或下拉激活。此参数可以是@ref GPIO\u pull\u define的值*/
  uint32_t Speed;     /*指定选定引脚的速度。此参数可以是@ref GPIO\u speed\u define的值*/
} GPIO_InitTypeDef;
//这段代码放在底层文件中,官方配置的。我们直接调用即可。

 GPIO_InitTypeDef GPIO_Initure;//我们自己书写的函数时使用的
//总的来说是提高了代码的可移植性以及可读性。

总的来说就是定义了一个结构体,方式与我们正常的C语言编程不同而已。结果是一样的。我们继续往下看

void LED_Init(void)
/***c语言函数部分**/
//空函数空返回值,定义了一个函数,函数的名字是LED_Init,空形参,空返回值

{
    GPIO_InitTypeDef GPIO_Initure;

//定义了一个名字为GPIO_Initure的结构体,里面有pin(引脚),mode(工作方式),pull(输出方式)
//speed(输出速度)几个属性的一个结构体

    __HAL_RCC_GPIOB_CLK_ENABLE();           	//开启GPIOB时钟
		__HAL_RCC_GPIOE_CLK_ENABLE();           	//开启GPIOE时钟
	//两个函数,功能如注释所示

    GPIO_Initure.Pin=GPIO_PIN_5; 				//PB5
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  	//推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          	//上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速
//使用struck的初始化方式对struck结构体进行了初始化
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
//这里又出现了一个新的函数HAL_GPIO_Init,我们继续go to去看下

	GPIO_Initure.Pin=GPIO_PIN_5; 				//PE5
	HAL_GPIO_Init(GPIOE,&GPIO_Initure);

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);	//PB5置1,默认初始化后灯灭
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);	//PE5置1,默认初始化后灯灭
}

HAL_GPIO_Init的go to结果(快速翻过即可)

void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)
{
  uint32_t position = 0x00u;
  uint32_t ioposition;
  uint32_t iocurrent;
  uint32_t temp;
  uint32_t config = 0x00u;
  __IO uint32_t *configregister; /* Store the address of CRL or CRH register based on pin number */
  uint32_t registeroffset;       /* offset used during computation of CNF and MODE bits placement inside CRL or CRH register */

  /* Check the parameters */
  assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
  assert_param(IS_GPIO_MODE(GPIO_Init->Mode));

  /* Configure the port pins */
  while (((GPIO_Init->Pin) >> position) != 0x00u)
  {
    /* Get the IO position */
    ioposition = (0x01uL << position);

    /* Get the current IO position */
    iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition;

    if (iocurrent == ioposition)
    {
      /* Check the Alternate function parameters */
      assert_param(IS_GPIO_AF_INSTANCE(GPIOx));

      /* Based on the required mode, filling config variable with MODEy[1:0] and CNFy[3:2] corresponding bits */
      switch (GPIO_Init->Mode)
      {
        /* If we are configuring the pin in OUTPUT push-pull mode */
        case GPIO_MODE_OUTPUT_PP:
          /* Check the GPIO speed parameter */
          assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
          config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_PP;
          break;

        /* If we are configuring the pin in OUTPUT open-drain mode */
        case GPIO_MODE_OUTPUT_OD:
          /* Check the GPIO speed parameter */
          assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
          config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_OD;
          break;

        /* If we are configuring the pin in ALTERNATE FUNCTION push-pull mode */
        case GPIO_MODE_AF_PP:
          /* Check the GPIO speed parameter */
          assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
          config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_PP;
          break;

        /* If we are configuring the pin in ALTERNATE FUNCTION open-drain mode */
        case GPIO_MODE_AF_OD:
          /* Check the GPIO speed parameter */
          assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
          config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_OD;
          break;

        /* If we are configuring the pin in INPUT (also applicable to EVENT and IT mode) */
        case GPIO_MODE_INPUT:
        case GPIO_MODE_IT_RISING:
        case GPIO_MODE_IT_FALLING:
        case GPIO_MODE_IT_RISING_FALLING:
        case GPIO_MODE_EVT_RISING:
        case GPIO_MODE_EVT_FALLING:
        case GPIO_MODE_EVT_RISING_FALLING:
          /* Check the GPIO pull parameter */
          assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
          if (GPIO_Init->Pull == GPIO_NOPULL)
          {
            config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_FLOATING;
          }
          else if (GPIO_Init->Pull == GPIO_PULLUP)
          {
            config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD;

            /* Set the corresponding ODR bit */
            GPIOx->BSRR = ioposition;
          }
          else /* GPIO_PULLDOWN */
          {
            config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD;

            /* Reset the corresponding ODR bit */
            GPIOx->BRR = ioposition;
          }
          break;

        /* If we are configuring the pin in INPUT analog mode */
        case GPIO_MODE_ANALOG:
          config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_ANALOG;
          break;

        /* Parameters are checked with assert_param */
        default:
          break;
      }

      /* Check if the current bit belongs to first half or last half of the pin count number
       in order to address CRH or CRL register*/
      configregister = (iocurrent < GPIO_PIN_8) ? &GPIOx->CRL     : &GPIOx->CRH;
      registeroffset = (iocurrent < GPIO_PIN_8) ? (position << 2u) : ((position - 8u) << 2u);

      /* Apply the new configuration of the pin to the register */
      MODIFY_REG((*configregister), ((GPIO_CRL_MODE0 | GPIO_CRL_CNF0) << registeroffset), (config << registeroffset));

      /*--------------------- EXTI Mode Configuration ------------------------*/
      /* Configure the External Interrupt or event for the current IO */
      if ((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE)
      {
        /* Enable AFIO Clock */
        __HAL_RCC_AFIO_CLK_ENABLE();
        temp = AFIO->EXTICR[position >> 2u];
        CLEAR_BIT(temp, (0x0Fu) << (4u * (position & 0x03u)));
        SET_BIT(temp, (GPIO_GET_INDEX(GPIOx)) << (4u * (position & 0x03u)));
        AFIO->EXTICR[position >> 2u] = temp;

        /* Configure the interrupt mask */
        if ((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT)
        {
          SET_BIT(EXTI->IMR, iocurrent);
        }
        else
        {
          CLEAR_BIT(EXTI->IMR, iocurrent);
        }

        /* Configure the event mask */
        if ((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT)
        {
          SET_BIT(EXTI->EMR, iocurrent);
        }
        else
        {
          CLEAR_BIT(EXTI->EMR, iocurrent);
        }

        /* Enable or disable the rising trigger */
        if ((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE)
        {
          SET_BIT(EXTI->RTSR, iocurrent);
        }
        else
        {
          CLEAR_BIT(EXTI->RTSR, iocurrent);
        }

        /* Enable or disable the falling trigger */
        if ((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE)
        {
          SET_BIT(EXTI->FTSR, iocurrent);
        }
        else
        {
          CLEAR_BIT(EXTI->FTSR, iocurrent);
        }
      }
    }

	position++;
  }
}

……………………………………

??????????

什么玩意……………………

好吧,抱歉拉下了一行

/**
  * @brief  Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init.
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
  * @param  GPIO_Init: pointer to a GPIO_InitTypeDef structure that contains
  *         the configuration information for the specified GPIO peripheral.
  * @retval None
  */

很显然我们进入的是官方的配置文件了,也就是官方的库。所谓的标准库以及hal库是不同的。当然我们也可以自己写库(这就是学习51单片机的同学最应该掌握的部分以及学习的部分)。但是对于学习32的同学来说我们只需要去看懂相应的函数用法即可。也就是说我们上面的长串代码不需要读懂,只需要看懂这段代码前面的官方注释即可。也提醒我们同学,在自己写库以及写代码的时候一定要加上注释加上简介,方便后续的使用。

/**
  *@简介   根据GPIO_Init中指定的参数初始化GPIOx外围设备。
	*@参数   GPIOx:其中x可以是(A~G,取决于使用的设备)来选择GPIO外围设备
	*@参数   GPIO_Init:指向包含指定GPIO外围设备的配置信息的GPIO_InitTypeDef结构的指针。
	*@返回值 无
  */

void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)
大致意思就是将我们定义的那个结构体放到GPIO_x中去
  HAL_GPIO_Init(GPIOB,&GPIO_Initure);
//所以这行代码是说,将我们定义的结构体放到GPIOB中得到的结果就是
//		GPIOB_pin_5的配置如下
//    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  	//推挽输出
//    GPIO_Initure.Pull=GPIO_PULLUP;          	//上拉
//    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速

这段分析之后我们再回到源代码中

void LED_Init(void)
/***c语言函数部分**/
//空函数空返回值,定义了一个函数,函数的名字是LED_Init,空形参,空返回值

{
    GPIO_InitTypeDef GPIO_Initure;

//定义了一个名字为GPIO_Initure的结构体,里面有pin(引脚),mode(工作方式),pull(输出方式)
//speed(输出速度)几个属性的一个结构体

    __HAL_RCC_GPIOB_CLK_ENABLE();           	//开启GPIOB时钟
		__HAL_RCC_GPIOE_CLK_ENABLE();           	//开启GPIOE时钟
	//两个函数,功能如注释所示

    GPIO_Initure.Pin=GPIO_PIN_5; 				//PB5
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  	//推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          	//上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速
//使用struck的初始化方式对struck结构体进行了初始化
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
//		GPIOB_pin_5的配置如下
//    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  	//推挽输出
//    GPIO_Initure.Pull=GPIO_PULLUP;          	//上拉
//    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速

	GPIO_Initure.Pin=GPIO_PIN_5; 				//PE5
//这里应该对代码没有改变,应该只是为了加个注释
	HAL_GPIO_Init(GPIOE,&GPIO_Initure);
//		GPIOE_pin_5的配置如下
//    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  	//推挽输出
//    GPIO_Initure.Pull=GPIO_PULLUP;          	//上拉
//    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);	//PB5置1,默认初始化后灯灭
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);	//PE5置1,默认初始化后灯灭
}
//The end

5.总结

我们可以看到,单片机的编程依旧是以C语言为基础的。同时今天讲解的这个struck结构体的方式不仅教授了大家struck在单片机中的应用。也教会了大家一些在keil中的常用检索方式,以及如何应对keil中的未知代码以及函数。当然还有一个最重要的最重要的!!找一个好的翻译软件。

以上就是c语言结构体在单片机中的应用的详细内容,更多关于c语言结构体单片机的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言 结构体(Struct)详解及示例代码

    前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放. 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{     结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可

  • C语言宏定义结合全局变量的方法实现单片机串口透传模式

    何谓透传? 根据百度百科给出的定义如下: 透传,即透明传输(pass-through),指的是在通讯中不管传输的业务内容如何,只负责将传输的内容由源地址传输到目的地址,而不对业务数据内容做任何改变. 在现实单片机产品开发过程中,如果存在多个串口,在调试打印某个模块信息的时候,大多数人的做法是将所有模块的TX.RX.GND引出来,分别接到不同的调试口去,通过PC终端去将这些信息分别打印出来.这样子做难免会弄错,甚至非常繁琐,万一不小心还会接错导致模块烧坏. 于是,透传模式的出现就是为了解决这样的问

  • C语言使用结构体实现简单通讯录

    C语言用结构体实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 代码实现: 头文件: #ifndef __HEAD_H__ ////防止头文件被多次调用 #define __HEAD_H__ #include<stdio.h> #include<string.h> #in

  • C语言利用结构体数组实现学生成绩管理系统

    要求: 某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入).定义结构体类型描述学生信息,每个学生信息包括:学号.姓名.多门课的成绩.总成绩和平均成绩.用结构体数组作为函数参数,编程实现如下菜单驱动的学生成绩管理系统. (1) 录入每个学生的学号.姓名和各科考试成绩. (2) 计算每门课程的总分和平均分. (3) 计算每个学生的总分和平均分. (4) 按每个学生的总分由高到低排出名次表. (5) 按学号由小到大排出成绩表. (6) 按姓名的字典顺序排出成

  • C语言结构体(struct)常见使用方法(细节问题)

    基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的"结构体变量"的初始化的结构体定义 //直接带变量名Huqinwei struct stuff{ char job[20]; int age; floa

  • C语言中结构体(struct)的几种初始化方法

    本文给大家总结的struct数据有3种初始化方法 1.顺序 2.C风格的乱序 3.C++风格的乱序 下面通过示例代码详细介绍这三种初始化方法. 1)顺序 这种方法很常见,在一般的介绍C的书中都有介绍.顺序初始化的特点是: 按照成员定义的顺序,从前到后逐个初始化:允许只初始化部分成员:在被初始化的成员之前,不能有未初始化的成员. 示例: struct User oneUser = {10, "Lucy", "/home/Lucy"}; 2)乱序(C风格) 顺序的缺陷是

  • C语言结构体定义的方法汇总

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据结构.结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问. 结构体与数组的比较 (1) 都由多个元素组成 (2) 各个元素在内存中的存储空间是连续的 (3) 数组中各个元素的数据类型相同,而结构体中的各个元素的数据类型可以不相同 结

  • 详解C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的. 函数指针 函数类型 (*指针变量名)(形参列表):第一个括号一定不能少. "函数类型"说明函数的返回类型,由于"()"的优先级高于"*",所以指针变量名外的括号必不可少.  注意指针函数与函数指针表示

  • 一文读懂c语言结构体在单片机中的应用

    Struck 看到单片机中有很多struck 的应用,但是呢我当初学C语言的时候又没有很认真的去学习,今天复习下,写一篇小小的交流,希望能够给大家带来帮助. 1.struck的定义 /***********方式一**********/ struct Book { char title[128]; char aurhor[40]; float price; unsigned int date; char pubilsher[40]; }; /*定义了Book这个模板*/ struct Book b

  • 一文读懂c++之static关键字

    一.静态变量 与C语言一样,可以使用static说明自动变量.根据定义的位置不同,分为静态全局变量和静态局部变量. 全局变量是指在所有花括号之外声明的变量,其作用域范围是全局可见的,即在整个项目文件内都有效.使用static修饰的全局变量是静态全局变量,其作用域有所限制,仅在定义该变量的源文件内有效,项目中的其他源文件中不能使用它. 块内定义的变量是局部变量,从定义之处开始到本块结束处为止是局部变量的作用域.使用static修饰的局部变量是静态局部变量,即定义在块中的静态变量.静态局部变量具有局

  • 一文读懂vue动态属性数据绑定(v-bind指令)

    v-bind的基本用法 一.本节说明 前面的章节我们学习了如何向页面html标签进行插值操作,那么如果我们想动态改变html标签的属性,该怎么办呢? 这就是我们这节开始要讲的内容v-bind. 二. 怎么做 ":"为v-bind的简写形式,也可称为语法糖 三. 效果 四. 深入 在上图中将a标签的href属性值设置为toutiao,VUE实例将自动去data里面寻找toutiao属性进行值绑定. 不只是a标签,所有的html标签属性都可以通过v-bind进行值绑定,然后通过改变数据动态

  • 一文读懂c++11 Lambda表达式

    1.简介 1.1定义 C++11新增了很多特性,Lambda表达式(Lambda expression)就是其中之一,很多语言都提供了 Lambda 表达式,如 Python,Java ,C#等.本质上, Lambda 表达式是一个可调用的代码单元[1]^{[1]}[1].实际上是一个闭包(closure),类似于一个匿名函数,拥有捕获所在作用域中变量的能力,能够将函数做为对象一样使用,通常用来实现回调函数.代理等功能.Lambda表达式是函数式编程的基础,C++11引入了Lambda则弥补了C

  • c语言结构体字节对齐的实现方法

    目录 1.什么是字节对齐 2.为什么要有字节对齐 3.手动设置对齐 4.结构体比较方法 1.什么是字节对齐 在c语言的结构体里面一般会按照某种规则去进行字节对齐. 我们先看一段代码: struct st1 { char name; double age; char sex; }; //32位下 sizeof(struct st1) = 16 //64位下 sizeof(struct st1) = 24 struct st2 { char a; char b; char c; }; //32位和6

  • 一文读懂MySQL 表分区

    目录 1. 什么是表分区 2. 分区的两种方式 2.1 水平切分 2.2 垂直切分 3. 为什么需要表分区 4. 分区实践 4.1 RANGE 分区 4.2 LIST 分区 4.3 HASH 分区 4.4 KEY 分区 4.5 COLUMNS 分区 5. 常见分区命令 6. 小结 松哥之前写过文章跟大家介绍过用 MyCat 实现 MySQL 的分库分表,不知道有没有小伙伴研究过,MySQL 其实也自带了分区功能,我们可以创建一个带有分区的表,而且不需要借助任何外部工具,今天我们就一起来看看. 1

  • 一文搞懂Go语言中文件的读写与创建

    目录 1. 文件的打开与关闭 1.1 os.open 1.2 os.OpenFile() 指定模式打开文件 2. 文件的读取 2.1 打开文件的方式读取文件中的数据 2.2 使用 bufio 整行读取文件 3. 写入文件操作 3.1 file.Write 与 file.WriteString 3.2 bufio.NewWriter 3.3 ioUtil 工具类 1. 文件的打开与关闭 1.1 os.open os.open 函数能打开一个文件 调用 close() 方法 关闭文件 //打开文件

  • 一文搞懂Go语言操作Redis的方法

    目录 前言 安装依赖包 连接redis redis连接池 总结 前言 Redis是一个开源的内存数据库,在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用.感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助. 安装依赖包 Go语言中使用第三方库go-redis go-redis支持连接哨兵及集群模式的Redis. 使用以下命令下载并安装: go get -u github.com/go-redis/redis/v8 连接redis 新建go文件,在项目中引入

  • C语言结构体struct详解

    目录 结构体的概念 结构体类型的声明 结构体变量的创建 typedef关键字 结构体的嵌套 结构体变量的初始化 结构体成员的访问 结构体的传参 总结 结构体的概念 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.组成结构型数据的每个数据称为结构型数据的“成员”.结构体通常用来表示类型不同但是又相关的若干数据. 结构体类型的声明 结构体类型的声明要使用 s t r u c t \color{#0000FF}{ struct} struct关键字,举个例子,比如我要定义一个学生的结构体类

  • php读取二进制流(C语言结构体struct数据文件)的深入解析

    尽管php是用C语言开发的,不过令我不解的是php没有提供对结构体struct的直接支持.不过php提供了pack和unpack函数,用来进行二进制数据(binary data)和php内部数据的互转: 复制代码 代码如下: string pack ( string $format [, mixed $args [, mixed $...]] )   //Pack given arguments into binary string according to format.  array unp

随机推荐