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

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

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

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

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

	struct {
		int in;
		int out;
	}GPIO_t;

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

	typedef struct {
		int in;
		int out;
	}GPIO_t;
	/*靜態(tài)分配內(nèi)存*/
	GPIO_t GPIOA;
	/*動態(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)建多個變量,例如:GPIO_t GPIOA,GPIOB;

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

	struct _GPIO_t{
		int in;
		int out;
	};

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

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

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

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

(type_name) expression

例如:

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

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

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

2、數(shù)據(jù)類型強制轉(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;
	 * 因為數(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);
		
}

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

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

實用舉例:

#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時鐘
	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ù)使用時,直接給成員變量賦值

*舉例說明結(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);

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

注:數(shù)據(jù)存儲格式分為大小端存儲,所以結(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;		//會自動四字節(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);

編譯運行結(jié)果:

注:因為自動對齊緣故,其中有些數(shù)據(jù)會自動丟掉

3、成員變量不使用自動給對齊

	int a[] = {1234,5678,'abcd',4444};
	
	/*
	 * ARM系統(tǒng)使用 __packed取消字節(jié)對齊 
	*/
	#pragma pack(1)		//強制設(shè)置1字節(jié)對齊 
	typedef struct _GPIO_t{
		int in;
		int out;
		char type;
		char value;
		int data;		//會自動四字節(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);

編譯運行結(jié)果:

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

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

相關(guān)文章

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

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

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

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

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

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

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

    C語言超詳細講解宏與指針的使用

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

    安平县| 罗江县| 白城市| 紫云| 新田县| 焦作市| 大名县| 兴和县| 云和县| 奉化市| 秀山| 太湖县| 东港市| 调兵山市| 台安县| 宣化县| 朝阳区| 沙田区| 固阳县| 原平市| 襄垣县| 团风县| 伊金霍洛旗| 贵港市| 濮阳县| 易门县| 临邑县| 平原县| 靖远县| 略阳县| 鹤峰县| 丹江口市| 昂仁县| 张家港市| 苍山县| 内丘县| 彩票| 新余市| 枣阳市| 云林县| 临安市|