c語言基礎

2021-08-16 16:26:43 字數 3296 閱讀 1602

1.對於結構體的使用,當前值是結構體實體時

使用 . 符號

引用,當前值是結構體指標時

使用 ->

符號引用

//定義乙個結構體指標

structstudent stu;  

structstudent * student = &stu;  

stu.score = 90.0f;  

stu.num = 102;  

stu.*** = 'f';  

stu.name = "amoe";  

//方法一:用.符號訪問

printf("num:%d, name:%s, ***:%c, score:%0.2f\n\n",(*student).num, (*student).name, (*student).***, (*student).score);  

//方法二:用->符號訪問,只要當用結構體指標的時候才可以使用這個操作符

printf("num:%d, name:%s, ***:%c, score:%0.2f",student->num, student->name, student->***, student->score); 

實體變數名.成員=(*指標).成員=指標->成員;所以一般

對於指標而言,使用  指標->成員  方式進行訪問;

結構體陣列的定義方法:

structstudent[40];

structstring;

structstring student[40];

存在兩個點h檔案:a.h和b.h檔案,兩個檔案中均定義了一些型別,若a.h想引用b.h中的型別則需要#include "b.h" 

,若b.h想引用a.h中的型別則需要#include "a.h ",但是若

兩個檔案中均定義了一些型別且兩個h都想使用對方的h檔案中的型別。這是非法的

。因為兩個h檔案之間的編譯是有先後順序的,先編譯a.h檔案,必然b.h檔案會報錯,二先編譯b.h檔案則必然a.h檔案會報錯。

需要特別注意的是,iar有時候a.c在工程中編譯沒有問題,能夠直接通過。但是

工程中增加乙個b.c檔案

(在其他工程編譯沒有問題)b.c檔案include 了a.h,

編譯出現錯誤

,而且錯誤提示為a.c中的一些資料型別沒有定義。在b.c中注釋 #include a.h。a.c就能編譯通過。出現這種情況原因不得而知。可以肯定的是

a.c以及b.c

中均使用了相同資料型別且都

沒有勾到

定義這些資料

型別的定義原始檔

。解決方法

就是在a.c以及b.c中

均勾到定義資料型別的c.h檔案。至於為什麼a.c以及b.c均可以使用c.h檔案中的資料型別。猜想可能是a.c以及b.c勾到的檔案中勾到了c.h,這樣a.c以及b.c等於間接勾到了c.h,就能夠使用c.h中的資料型別。至於為什麼當b.c勾引到a.h的時候就會編譯報錯?不知道。這裡有乙個猜想是b.c勾到了a.h,那麼b.c到達資料型別的定義檔案c.h就有兩條路徑。編譯器無法將兩個路徑柔和理解為最終指向同一份檔案,進而出現報錯。

結構體是可以可以直接賦值的,只要結構體型別一致;

二維陣列

二維陣列的好處就是能夠非常直觀地展現資料,但是二維陣列也有他的使用規則。我們必須按照他的規則辦事,否則,編譯器會給你報錯;其中要說的是二維陣列的初始化。二維陣列代表的是行列,那麼一共有n行就有n個大括號,有m列,則每個大括號裡面就有m個元素。二維陣列有兩種賦值方式:

1.int table[2][2]=;

2.int table[2][2]=,

在這個簡單的二維陣列中看似兩種初始化的方式一樣,甚至第一種的初始化使用還顯得簡單易用。

但是,在一些複雜一點的資料結構上第一種初始化的方式用起來就顯得不那麼順手。比如說,結構體二維陣列:

//宣告乙個結構體型別

typedef struct a

int a;

int b;

}b;//定義並初始化乙個結構體二維陣列

b table[3][4]=,,

,},,,

,},,,

,}};//這種方式是可行的,編譯器不會報錯;

但是這種方式:

b table[3][4]=, ,,,

, ,,,

, ,,,

, ,, };

會報錯,為什麼呢?原因是這樣的:c語言的語法認為,在二維陣列下第乙個層級裡乙個大括號就代表

一行資料,所以當二維陣列遇上結構體就會出現這樣的問題。給結構體賦值是需要大括號的,那按照二維陣列賦值的第一種方式,就是很多大括號結構體累積在一起。但是編譯器會把它看做是一行的元素,實際上只是乙個元素而已;

驅動的寫法

這幾天一直在研究2640的驅動,恍然大悟。2640的驅動都是使用乙個函式登錄檔進行封裝,利用handle來實現對硬體的控制。基本的思維是這樣的:定義一些函式指標型別,再利用這些函式指標型別定義乙個函式表結構體型別,乙個驅動必然包括硬體、功能表、設計驅動的一些公用協議可選擇的部分(例如uart的停止位空閒位等等諸如此類)。前面已經定義好了函式功能表結構體型別(通常用fxntable表示),需要關於硬體設定的結構體型別(通常用hw表示),公用規範可修改部分(通常用object表示)。這些結構型別定義完成後,定義乙個驅動設定表,將他們包含進來。這樣在這個設定表裡面函式,引數設定,硬體選擇都有了。直接用乙個handle就能訪問到裡面的任何東西。而這個handle實際上就是乙個驅動設定表型別的指標。整個過程實際上它為底層鋪設了乙個handle引用系統。應用層呼叫的時候找到合適的handle就能方便快捷的使用。但是這種寫法的乙個缺點就是驅動的單線性,同時只能使用乙個handel,並線、迴圈多次使用的情況需要通過應用層的for實現。

乙個產品功能分離下來後會形成很多的功能模組,一般而言到這裡基本基於平台晶元我們就會開始寫這部分的**。但是實際上功能模組往下繼續分離,我們還能繼續細分。功能模組往下分我將他分為資料結構演算法與平台兩部分,若是功能是乙個比較通用的功能。平台程式所佔又不是非常大的話,考慮將兩者分離,這樣就可以形成跨平台的功能模組。這個功能模組終究是要與平台介面銜接的。那怎麼實現模組與平台分離呢?通過指標函式實現。構建乙個平台檔案,功能模組呼叫這個平台檔案的介面,這個介面再呼叫平台提供的介面,這樣等於平台檔案實現的是給函式指標賦值,更換平台時更換這個介面即可。無線產品會經常涉及到一些通訊協議。建議所有的通訊協議的解析與生成在乙個檔案中完成。

c 語言基礎

三個訪問描述符 public private 和protected 都可以修飾類的資料成員和成員函式 public 可以可以被任何訪問,private 只能被該類的公,私成員函式,該類的友元函式或者友元類的成員函式訪問。protected 只能被該類的公,私成員函式和該類的派生類訪問。c 中除了,和...

c語言基礎

1.問題描述 從鍵盤輸入三個整數,分別存入x,y,z三個整型變數中,計算並輸出三個數的和以及平均值。輸入形式 從鍵盤輸入三個整數,整數之間以空格隔開。輸出形式 在螢幕上分兩行顯示結果 第一行為三個數的和,整數形式輸出 第二行為三個數的平均值,浮點數形式輸出,小數點後保留兩位小數。輸入樣例 3 2 3...

C語言基礎

找最大最小整數 2.問題描述 編寫乙個程式,使用者輸入若干整數,試找出其中的最大數和最小數。輸入形式 使用者在第一行待輸入資料個數,在第二行輸入資料。輸出形式 程式在下一行輸出資料的最大值和最小值 樣例輸入 589 62 96 74 52 樣例輸出 96 52 樣例說明 使用者第一次輸入的為資料個數...