最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c語言struct結(jié)構(gòu)體強(qiáng)制類型轉(zhuǎn)換的實(shí)現(xiàn)

 更新時(shí)間:2026年01月12日 08:55:43   作者:blog_xu  
本文深入探討了C語言中結(jié)構(gòu)體的定義、初始化及成員訪問,包括無標(biāo)簽和顯示標(biāo)簽聲明,以及如何通過typedef簡化結(jié)構(gòu)體使用,具有一定的參考價(jià)值,感興趣的可以了解一下

一、 關(guān)于struct相關(guān)說明

1、無結(jié)構(gòu)體標(biāo)簽

	struct {
		int in;
		int out;
	}GPIO_t;

聲明了一個(gè)無名結(jié)構(gòu)體,并創(chuàng)建了一個(gè)結(jié)構(gòu)體變量GPIO_t(已分配空間),該方法只適合創(chuàng)建一個(gè)結(jié)構(gòu)體變量

	typedef struct {
		int in;
		int out;
	}GPIO_t;
	/*靜態(tài)分配內(nèi)存*/
	GPIO_t GPIOA;
	/*動(dòng)態(tài)分配內(nèi)存*/
	GPIO_t *GPIOA = (GPIO_t*)malloc(sizeof(GPIO_t));
	free(GPIOA);

使用typedef關(guān)鍵字,可以為結(jié)構(gòu)體GPIO_t創(chuàng)建多個(gè)變量,例如:GPIO_t GPIOA,GPIOB;

2、顯示聲明結(jié)構(gòu)體標(biāo)簽

	struct _GPIO_t{
		int in;
		int out;
	};

如需聲明多個(gè)結(jié)構(gòu)體變量:struct _GPIO_t GPIOA,GPIOB;

注:常用第二種方法聲明創(chuàng)建結(jié)構(gòu)體,具體高級(jí)用法請看下面講解

二、強(qiáng)制類型轉(zhuǎn)換

1、普通數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換,使用強(qiáng)制類型轉(zhuǎn)換符

(type_name) expression

例如:

	int sum = 17, count = 5;
	double mean;
	
	mean = (double)sum / count;
	printf("Value of mean : %f \n",mean);

編譯運(yùn)行輸出以下結(jié)果:

注:這里要注意的是強(qiáng)制類型轉(zhuǎn)換運(yùn)算符的優(yōu)先級(jí)大于除法,因此 sum 的值首先被轉(zhuǎn)換為 double 型,然后除以 count,得到一個(gè)類型為 double 的值

2、數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)化為結(jié)構(gòu)體類型

#include <stdio.h>

int main (void) {
	
	int a[] = {1,2,'a','b'};
	
	typedef struct _GPIO_t{
		int in;
		int out;
		int type;
		int value;
	}GPIO_t;
	
	GPIO_t *GPIOA = (GPIO_t *) &a;
	/*
	 * 等同于GPIO_t *GPIOA = (GPIO_t *) &a;
	 * 因?yàn)閿?shù)組的首地址為 可以表示為 a,&a,&a[0] 
	*/
	printf("%d \n",GPIOA->in);
	printf("%d \n",GPIOA->out);
	printf("%c \n",GPIOA->type);
	printf("%c \n",GPIOA->value);
		
}

編譯運(yùn)行如何結(jié)果:

注:通過該方法可以把某一起始地址的數(shù)據(jù)類型與結(jié)構(gòu)體成員相對應(yīng),以后直接通過結(jié)構(gòu)體成員去訪問
結(jié)構(gòu)體成員之間默認(rèn)32位對齊,在定義成員時(shí)需要特別注意

實(shí)用舉例:

#include <stm32f10x.h>
typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

/*Peripheral base address define*/
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
#define GPIOA                 ((GPIO_TypeDef *) GPIOA_BASE)

/*函數(shù)調(diào)用*/
#include "led.c"
void LED_Init(void)
{
	RCC->APB2ENR|=1<<3;    // 使能PORTA時(shí)鐘
	GPIOA->CRL&=0XFF0FFFFF; 
	GPIOA->CRL|=0X00300000;//PA.5 推挽輸出
	GPIOA->ODR|=1<<5;      //PA.5 輸出高
}

三、給結(jié)構(gòu)體變量賦值

	GPIO_t GPIOB = {
		.in = 3,
		.out = 4,
		.type = 'A',
		.value = 'B' 
	};
	printf("%d \n",GPIOB.in);
	printf("%d \n",GPIOB.out);
	printf("%c \n",GPIOB.type);
	printf("%c \n",GPIOB.value);

注:callback函數(shù)使用時(shí),直接給成員變量賦值

*舉例說明結(jié)構(gòu)體成員數(shù)據(jù)類型對齊問題
1、成員變量字節(jié)已經(jīng)對齊使用

	int a[] = {'abcd',4444};
	typedef struct _GPIO_t{
		char in;
		char out;
		char type;
		char value;
		int data;
	}GPIO_t;
	
	GPIO_t *GPIOA = (GPIO_t *) &a;

	printf("%c \n",GPIOA->in);
	printf("%c \n",GPIOA->out);
	printf("%c \n",GPIOA->type);
	printf("%c \n",GPIOA->value);
	printf("%d \n",GPIOA->data);

編譯運(yùn)行輸出結(jié)果:

注:數(shù)據(jù)存儲(chǔ)格式分為大小端存儲(chǔ),所以結(jié)構(gòu)引用輸出順序可能不太對應(yīng)

2、成員變量沒有對齊

	int a[] = {1234,5678,'abcd',4444};
	typedef struct _GPIO_t{
		int in;
		int out;
		char type;
		char value;
		int data;		//會(huì)自動(dòng)四字節(jié)對齊因此直接指向a[3] 
	}GPIO_t;
	
	GPIO_t *GPIOA = (GPIO_t *) &a;

	printf("%d \n",GPIOA->in);
	printf("%d \n",GPIOA->out);
	printf("%c \n",GPIOA->type);
	printf("%c \n",GPIOA->value);
	printf("%d \n",GPIOA->data);

編譯運(yùn)行結(jié)果:

注:因?yàn)樽詣?dòng)對齊緣故,其中有些數(shù)據(jù)會(huì)自動(dòng)丟掉

3、成員變量不使用自動(dòng)給對齊

	int a[] = {1234,5678,'abcd',4444};
	
	/*
	 * ARM系統(tǒng)使用 __packed取消字節(jié)對齊 
	*/
	#pragma pack(1)		//強(qiáng)制設(shè)置1字節(jié)對齊 
	typedef struct _GPIO_t{
		int in;
		int out;
		char type;
		char value;
		int data;		//會(huì)自動(dòng)四字節(jié)對齊因此直接指向a[3] 
	} GPIO_t;
	
	GPIO_t *GPIOA = (GPIO_t *) &a;

	printf("%d \n",GPIOA->in);
	printf("%d \n",GPIOA->out);
	printf("%c \n",GPIOA->type);
	printf("%c \n",GPIOA->value);
	printf("%d \n",GPIOA->data);

編譯運(yùn)行結(jié)果:

注:最后一個(gè)成員由于對齊錯(cuò)誤出現(xiàn)亂碼

到此這篇關(guān)于c語言struct結(jié)構(gòu)體強(qiáng)制類型轉(zhuǎn)換的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c語言struct結(jié)構(gòu)體強(qiáng)制類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt中實(shí)現(xiàn)多線程導(dǎo)出數(shù)據(jù)功能的四種方式小結(jié)

    Qt中實(shí)現(xiàn)多線程導(dǎo)出數(shù)據(jù)功能的四種方式小結(jié)

    在以往的項(xiàng)目開發(fā)中,在很多地方用到了多線程,本文將記錄下在Qt開發(fā)中用到的多線程技術(shù)實(shí)現(xiàn)方法,以導(dǎo)出指定范圍的數(shù)字到txt文件為例,展示多線程不同的實(shí)現(xiàn)方式
    2025-08-08
  • C語言實(shí)現(xiàn)五子棋小游戲

    C語言實(shí)現(xiàn)五子棋小游戲

    五子棋游戲是一款很經(jīng)典的智力游戲,只有學(xué)過編程語言的人,把五子棋的編程原理弄懂了,就能用自己熟悉的語言實(shí)現(xiàn)出來,在這里給大家分享,c語言五子棋源碼,僅供大家參考借鑒。
    2016-03-03
  • Qt 實(shí)現(xiàn)鋼筆畫線效果示例及詳細(xì)原理

    Qt 實(shí)現(xiàn)鋼筆畫線效果示例及詳細(xì)原理

    這篇文章主要介紹了Qt 實(shí)現(xiàn)鋼筆畫線效果示例及詳細(xì)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語言超詳細(xì)講解宏與指針的使用

    C語言超詳細(xì)講解宏與指針的使用

    宏定義是用宏名來表示一個(gè)字符串,在宏展開時(shí)又以該字符串取代宏名,這只是一種簡單的替換。要想突破C語言的學(xué)習(xí),對指針的掌握是非常重要的,本文將具體針對宏與指針的基礎(chǔ)做詳盡的介紹
    2022-06-06
  • 最新評論

    双城市| 葵青区| 东乡| 罗山县| 高邮市| 浦东新区| 资源县| 青浦区| 镇赉县| 无锡市| 正镶白旗| 清徐县| 崇礼县| 宁晋县| 灵璧县| 清水河县| 安福县| 调兵山市| 二连浩特市| 鸡西市| 门源| 会理县| 平度市| 大同县| 江油市| 大足县| 克山县| 凤冈县| 五河县| 兴业县| 襄城县| 琼结县| 明溪县| 台南市| 黔西县| 巴林左旗| 那曲县| 攀枝花市| 大宁县| 赣州市| 马关县|