VC 學習筆記(1) C 語法注意點

2022-01-30 07:40:05 字數 3825 閱讀 7295

1. 結構struct和共用體union

共用體是一種資料格式,它能夠儲存不同的資料型別,單只能同時儲存其中的一種型別。如結構可以同時儲存int、long和double,共用體只能儲存int、long或double。

2. 使用cin.get(char)

使用cin輸入,將忽略空格和換行符,而傳送給cin的輸入被緩衝,這意味著使用者必須按下回車才可以把輸入的內容傳送給程式。

這裡可以選擇採用cin.get(char)進行補救,最後輸入ctrl+z執行eof結束。

3. 二維陣列和指標陣列

看這樣的兩個陣列:

char* cities1[5] =

;char cities2[5][10] =

;

因為二維陣列的最大長度限制為10個字元,而指標陣列儲存的是字串的位址,從儲存空間角度說,使用指標陣列更為經濟;然後修改的話,二維陣列是更好的選擇。

4. 字元函式庫cctype

在標頭檔案cctype(老式風格中為ctype.h)

5. const int * 和 int * const 的區別

int sloth = 3;

const int * ps = &sloth;

int * const finger = &sloth;

這種宣告格式使得finger只能只想sloth,但允許使用finger來修改sloth的值。中間的宣告不允許使用ps來修改sloth的值,但允許將ps指向另乙個位置。

6. 函式指標

直接看例子:

double betsy(int);

double pam(int);

void estimate(int lines, double (*pf)(int));

int main()

double betsy(int lns)

double pam(int lns)

void estimate(int lines, double (*pf)(int))

7.memsetvoid *memset(void *s,  int c, size_t n);

memset:作用是在一段記憶體塊中填充某個給定的值,它對較大的結構體或陣列進行清零操作的一種最快方法。

常見的三種錯誤

第一: 搞反了c 和 n的位置.

一定要記住 如果要把乙個char a[20]清零, 一定是 memset(a, 0, 20) 

而不是 memset(a, 20,  0) 

第二: 過度使用memset, 我想這些程式設計師可能有某種心理陰影, 他們懼怕未經初始化的記憶體, 所以他們會寫出這樣的**:

char buffer[20];

memset(buffer, 0, sizeof((char)*20));

strcpy(buffer, "123");

這裡的memset是多餘的. 因為這塊記憶體馬上就被覆蓋了, 清零沒有意義. 

第三: 其實這個錯誤嚴格來講不能算用錯memset, 但是它經常在使用memset的場合出現

int some_func(struct something *a)
8. 大端格式和小端格式

short int x;

char x0,x1;

x=0x1122;

x0=((char*)&x)[0]; //低位址單元

x1=((char*)&x)[1]; //高位址單元

① 定義乙個ctime類物件 ctime time;

② 得到當前時間 time = ctime::getcurrenttime();

③ getyear( ),getmonth( ), getday( ), gethour( ), getminute( ), getsecond( ), getdayofweek( ) 返回整型(int)對應專案

④ 將當前時間格式化 cstring date = time.format("%y-%m-%d %h:%m:%s %w-%a");

說明:1) 結果為:2006-10-13 17:23:47 41-friday

2) 格式符號說明

%a —— 星期(縮寫英文),如fri;

%a —— 星期(全寫英文),如friday

%b —— 月份(縮寫英文),如oct

%b —— 月份(全寫英文),如 october

%c —— 月/日/年 時:分:秒,如 10/13/06 19:17:17

%d —— 日期(1 ~ 31)

%h —— 時(24小時制)(0 ~ 23)

%i —— 時(12小時制)(0 ~ 12)

%j —— 一年當中的第幾天,(1 ~ 366)

%m —— 月份(數字 1 ~ 12)

%m —— 分(0 ~ 59)

%p —— 12小時中的a m/pm指示,或者am,或者pm

%s —— 秒(0 ~ 59)

%u —— 一年中的第幾周,星期日作為每週的第一天(0 ~ 53)

%w —— 星期(數字表示,0 ~ 6,0代表星期日)

%w —— 一年中的第幾周,星期一作為每週的第一天(0 ~ 53)

%x —— 月/日/年,%c的前半段

%x —— 時/分/秒,%c的後半段

%y —— 年份(不帶世紀,如 06)

%y —— 年份(帶世紀,如 2006)

%z,%z —— 時區名稱或縮寫,如果時區未知,此字元為空,如「中國標準時間」

%% —— %

「#」標誌的含義:

① %#a, %#a, %#b, %#b, %#p, %#x, %#z, %#z, %#% ——「#」 被忽略

② %#c —— 把%c中的數字變成英文,再在前面加上星期, 如:「tuesday, march 14, 1995, 12:41:29」.

③ %#x —— 把%x中的數字變成英文,再在前面加上星期,如:tuesday, march 14, 1995

④ %#d, %#h, %#i, %#j, %#m, %#m, %#s, %#u, %#w, %#w, %#y, %#y —— 如果開 頭為0,去掉開頭的0

12. 函式引用返回左值

char &get_val(string &str, string::size_type ix)

string s("a value");

cout << s << endl;

get_val(s, 0) = 'a';

cout << s << endl;

13. 在c語言中引入組合語言

extern "c" __declspec(dllexport) int add(int a, int b)

return c;

}

14. #pragma once是個預處理指令,在標頭檔案的最開始加入這條指令表示:這個標頭檔案只被編譯一次

學習筆記1 C 總結

溫故而知新,總結過去,展望未來!一 函式過載 c 中允許通過換名機制實現函式過載,函式過載是指在相同的作用域中,允許存在多個函式名相同的函式 存在條件 他們的引數個數 引數型別 引數排列必須不同,返回值型別不做要求 二 異常處理 所謂異常,就是程式執行到某乙個函式或者方法內部時候,出現了與程式涉及流...

1 C 學習筆記 記憶體模型

c 和c語言對於變數定義的方式型別,定義的不同方式確定了變數的生存週期 作用範圍以及可以被誰使用的 許可權 問題。一般來講我們把儲存的持續性簡稱為變數在程式中定義的位置,有以下三個位置 1.自動儲存持續性 簡稱自動變數,該變數定義在具體的函式塊中,並且不加 static 這種修飾符,該類變數從函式被...

Unity學習筆記(1) C 的相關筆記

主要分為兩種型別 1 值型別 直接儲存在記憶體的棧上面 2 引用型別 在記憶體的棧上面衍生出乙個引用,在記憶體的堆上面才會儲存具體的值 3 指標型別 僅在不安全專案中使用 值型別 1 內建型別,如int bool等 2 使用者可自定義的struct型別及列舉enum型別 所有的值型別均繼承於syst...