1. 程式人生 > 其它 >C結構體struct

C結構體struct

C結構體struct

2、結構體定義

1、結構體就是可以把變數包含到裡面的東西

struct就代表要定義一個結構體,sensors是這個結構體的名字, 然後是一個大括號 { }

大括號裡面就隨意定義變數啦~

怎麼使用裡面的變數呢?

注意:結構體是一個數據型別就像是int和char一樣的這種型別。

既然是一種資料型別, 那麼就可以用這個資料型別定義變數。

定義一個該結構體的變數:

為啥要那樣子定義啊?

答:你去問造C語言的那幫傢伙去!問問他們為啥要設計成這樣子!

然後操作結構體變數裡面的成員變數。當我們定義好結構體變數後,在初始化變數裡面的成員變數時就會自動出現結構體裡面的成員變數,如果這個程式碼是你一個一個敲出來的話,你就會感嘆結構體在微控制器中是那麼的奇妙!

有人會問為啥是結構體變數中間加個點?

答:你去問造C語言的那幫傢伙去!問問他們為啥要設計成這樣子。

2、其實定義結構體變數可以下面這樣子

也可以定義多個:

發現了沒,每個結構體變數都是單獨擁有結構體裡面的全部成員變數。

就像是最開始說的,如果再增加一套感測器:溫溼度、光照強度、煙霧濃度、酒精濃度。

使用結構體的話只需要再定義一個結構體變數即可

但很多時候,我們在微控制器中見到的結構體並不是上面那樣定義的,而是在前面加了一個typedef 關鍵字。

這樣的例子在庫函式的標頭檔案中,我們經常會看到如下結構體:

3、typedef關鍵字

先看一下百度百科對typedef的定義:

總結一句就是:typedef

可以把一個數據型別取一個別的名字

typedef {資料型別} {別的名字}

#include "sys.h"
#include "delay.h"
#include "usart.h"

typedef int zhjiguoxin;//zhjiguoxin就是int

zhjiguoxin value = 0;

int main(void)
{ 
 uart_init(115200);//串列埠初始化
 delay_init(); 

 printf("value=%d\r\n",value);
 
    while(1)
 { 
 } 
}

雖然typedef可以給變數取別名,但是沒有誰會像上面那樣取名字,我這裡只是舉一個例子。

4、結構體的精髓

注意:

1、下面的代表了這個結構體資料型別

2、給這個資料型別起一個別名

注意是三部分, typedef {資料型別} {別的名字}。所以sensor就代表了這個結構體了。

建議初學者把下面這張圖儲存到你的電腦,這樣你就永遠也不會忘記typedef在結構體中的用法了,也能很快的記住結構體這個東東。

3、以後定義結構體變數的時候,就不需要像最開始那樣struct sensors sen;這樣的定義結構體變量了,只需要sensor sen;即可。

4、結構體名字可以省略

注意結構體定義可以不寫結構體名,對C語言來說,那個sensors不叫結構體名,而是叫標籤(tag)。C語言結構體名是struct關鍵字 + tag。所以為了簡便,我們看到的微控制器中的結構體都是寫成如下的形式。

5、結構體的變數可以放任何變數

1、結構體變數可以放任何變數(int型指標)

#include "sys.h"
#include "delay.h"
#include "usart.h"
typedef struct 
{
 float temperature; //溫度
 char  humidity;    //溼度
 char  alcohol;    //酒精濃度
 int   illumination;//光照強度
 char  CO;  //一氧化碳濃度
 int   *p;  //int型的指標變數
} sensor;
sensor sen;
int value =0;
int main(void)
{
 uart_init(115200);//串列埠初始化
 delay_init(); 
 sen.p=&value;//把value的地址賦值 
 //列印p代表的地址裡面的值(其實就是列印value的值)
 printf("value=%d\r\n",*(sen.p)); 
    while(1)
 { 
 } 
}

既然是指標變數,所以給指標變數賦值時當然是賦值的是一個地址。

2、結構體變數可以放任何變數(函式指標)

#include "sys.h"
#include "delay.h"
#include "usart.h"
typedef struct 
{
 float temperature; //溫度
 char  humidity;    //溼度
 char  alcohol;    //酒精濃度
 int   illumination;//光照強度
 char  CO;  //一氧化碳濃度
 int   *p;  //int型的指標變數
 void (*fun)();
} sensor;
sensor sen;
void function()
{
 printf("zhiguoxin\r\n");
}
int value =0;
int main(void)
{ 
 uart_init(115200);//串列埠初始化
 delay_init(); 
 sen.fun=function; 
 sen.fun(); 
    while(1)
 { 
 } 
}

既然是函式指標變數,所以給函式指標變數賦值時當然是賦值的也是地址,並且還要是一個函式的地址,而一個函式的函式名就是該函式的地址。所以才會有下面的把函式function();的地址function賦值給函式指標fun。

這樣大家是不是很清楚了?如果不清楚,建議看個3遍以上!

3、結構體變數可以放任何變數(結構體變數)

這就是結構體巢狀,在一個結構體內包含了另一個結構體作為其成員。當出現結構體巢狀時,必須以級聯方式訪問結構體成員,即通過成員選擇運算子逐級找到最底層的成員時再引用。

#include "sys.h"
#include "delay.h"
#include "usart.h"

typedef struct 
{
  int i;
}zhiguoxin;

typedef struct 
{
 float temperature; //溫度
 char  humidity;    //溼度
 char  alcohol;    //酒精濃度
 int   illumination;//光照強度
 char  CO;  //一氧化碳濃度
 int   *p;  //int型的指標變數
 void (*fun)(); 
 zhiguoxin guougo; 
}sensor;

sensor sen;

int main(void)
{ 
 uart_init(115200);//串列埠初始化
 delay_init();
 
 sen.guougo.i=100;
 printf("i=%d\r\n",sen.guougo.i);
  
    while(1)
 { 
 } 
}

4、結構體變數可以放任何變數(結構體指標)

結構體是一個數據型別。當然,資料型別也可以定義對應的指標變數啦。

就像是int 型別可以定義 int *p; 一樣

所以,當大家如果發現你的程式碼中結構體是通過—>訪問的話,那麼這個結構體變數一定是指標型別的變數。

同理,如果程式碼中結構體是通過.訪問的話,那麼這個結構體變數就不是指標變數,而是一般的變數。

總結:至此,有關結構體在微控制器中的應用,相信你已經掌握的差不多了。大家可能感覺本文的內容太簡單了,但只有把這個簡單的基礎性知識打牢,你才能進步得更快,否則你總感覺自己的程式碼差點意思。

來源:果果小師弟


版權歸原作者所有,如有侵權,請聯絡刪除。