1、void和void*
void表示的是無符號型別,不能用來定義變數或常量,但是可以定義指標,如void* ptr。
void指標可以指向任意型別的資料,可用任意資料型別的指針對void指標賦值,比如:
int *pint;void *pvoid = pint ; //將int型別的指標賦值給void型別的指標
指標的賦值可以認為是位址的傳遞,而一般的32位系統指標占用4個位元組,所以指標賦值只是這4個位元組的賦值,與型別沒什麼關係。
2、volatile
vola
tile表示變數是易變的,告訴編譯器不要優化該變數,每次都從記憶體中讀寫該變數,而不是暫存器中的備份。如在中斷裡需要不斷讀取該變數的值,主函式中又在不斷修改,此時建議加上volatile關鍵字。
volatile unsigned char angle; //全域性變數int main()}/* 定時器0工作方式1中斷 */void timer0_irq(void) interrupt 1 using 1
3、不同型別資料所佔內存在程式設計時一定要了解不同型別變數所佔位元組數。下面列出一部分常用型別:
32位系統中
型別名字節
二進位制位數
char18
short216
int4
32long432
float432
double864
8位系統中
型別名字節
二進位制位數
char18
short216
int2
16long432
float432
double432
4、const和指標
const修飾的值不可改變,在指標中主要看所處的位置,竅門是去掉資料型別看const後面是
* 還是變數名。如下所示:
const int *pval; //去掉型別名是 const *pval,故修飾指標所指向的內容不可變,為常量指標int *const pval; //去掉型別名是 *const pval,故修飾指標即位址不可變,為指標常量。
5、結構體和共用體
微控制器的庫檔案一般用結構體和共用體的組合方式,
對於結構體和共聯體在嵌入式領域是使用得非常頻繁的,一些可程式設計晶元提供的暫存器庫都是採用結構體和共聯體結合的方式來提供給軟體人員進行開發,同時在平時的編碼過程中這兩個資料型別的靈活應用也能夠實現**更好的封裝與簡化。
如下面的簡單示例,就可以非常靈活的訪問val中的bit位。
typedef unionbits;}char_val, char_bits;/* 主函式 */int main(); //設定為二進位制 0000 1111 = 0x0f = 15 val.bits.b7 = 0; val.bits.b6 = 0; val.bits.b5 = 0; val.bits.b4 = 0; val.bits.b3 = 1; val.bits.b2 = 1; val.bits.b1 = 1; val.bits.b0 = 1; printf("val = %d\r\n", val.val); // 輸出結果為15 return 0;}
輸出結果:
val = 15請按任意鍵繼續. . .
6、預定義識別符號
如下是常用的標識:
__file__ :表示在原始檔中插入當前源檔名;
__line__ :表示當前檔案的行號;
__date__:表示檔案日期;
__time__ :表示檔案時間;
__stdc__:當要求程式嚴格遵循ansi c標準時,該標識被賦值為1
__cplusplus:當編寫c++程式時該識別符號被定義
... :表示不檢查形參與實參是否相同,也不檢查個數
使用範例:
#include #include #define __debug__#ifdef __debug__#define debugall(format, ...) printf("data:"__date__", file:"__file__", line:%05d:"format"\r\n",__line__, ##__va_args__)#define debug( ...) printf( ##__va_args__)//類似printf#else#define debug(format,...)#endif /* 主函式 */int main(int argc, char **ar**) return 0;}
輸出結果:data:dec 26 2020, file:i:\c_study\projecttest\project1\project1\main.c, line:00026:hello worldhello world72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0, 請按任意鍵繼續. . .
7、「#」 和 「##」#define str(s) #s //轉為字串#define comb(str1, str2) str1##str2 //拼接物件#define debug( ...) printf( ##__va_args__) //同printf功能一樣/* 主函式 */int main()
end
R語言讀取檔案
本文的主要內容是讀取檔案內容,並且將檔案中的所有內容沒咧放在乙個物件當中,以便之後進行操作,樣本資料如下 kernel coorauthor num 鄭稱德 丁俊武 1 鄭稱德 韓玉啟 2 鄭稱德 周梅 3 丁俊武 韓玉啟 4 丁俊武 鄭稱德 4 丁俊武 周梅 4 丁俊武 仇成 43 丁俊武 馮俊文...
R語言中檔案的讀寫
1.json檔案 library jsonlite file users abcd documents diff files json test.json json1 read json path file write json json1,path file 2.yaml檔案 library ya...
R 語言中對檔案的操作
由於最近在處理一些真實資料時涉及到巢狀的.tar.gz檔案的解壓,手動乙個乙個解壓過於麻煩。可以使用 shell 指令碼或者 bat 指令碼來做,但想嘗試使用 r 語言對其進行完全解壓,這裡就需要涉及到對檔案與資料夾的一些操作。網上已經有許多現有教程,這裡參考了很多網上的 不過會嘗試盡量寫得更加詳細...