C語言具有簡潔緊湊,靈活方便,運算符豐富,數(shù)據(jù)類型豐富,表達方式靈活實用等特點,所以C語言程序設計更主動、靈活。很多人從C語言入門編程,下面整理了一些C語言基礎知識,希望對大家有所幫助!
在呼瑪?shù)鹊貐^(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網站制作、成都做網站 網站設計制作定制網站建設,公司網站建設,企業(yè)網站建設,品牌網站制作,成都營銷網站建設,成都外貿網站制作,呼瑪網站建設費用合理。
1.C語言中,變量必須先聲明后使用,即一個程序塊(花括號對)中所有臨時變量必須在第一條可執(zhí)行語句之前全部聲明,而不能像C++那樣隨用隨聲明;
2.C語言中參數(shù)傳值傳遞形參,即為參數(shù)的拷貝,此與C++/JAVA相同,同時值得注意,ANSI C不支持引用,此與C++/JAVA有區(qū)別,那么要對參數(shù)進行修改只能使用指針方式(指針傳值指針本身仍是形參,要修改指針本身那必須使用雙重指針);
3.C語言默認類型為int,即參數(shù)無類型或函數(shù)無返回值類型聲明,則認為是int(貌似一些編譯器不支持),同時不建議使用該特性;
4.無參數(shù)的函數(shù)聲明應當使用void表明,否則C語言按照老式聲明方法忽略參數(shù)類型檢查;
5.全局變量建議全大寫,局部變量建議全小寫,內部變量31個字符有效,外部變量不區(qū)分大小寫,僅6個字符有效,所以必須保持唯一性;
6.ANSI C是按照多字節(jié)實現(xiàn)的,UNICODE是后來發(fā)展的,所以有char/WCHAR,與.NET中char直接是雙字節(jié)有區(qū)別,在C#中導入dll時值得注意;
7.C語言支持枚舉,并且枚舉和int直接強制類型轉換即可,比.NET方便;
8.#define聲明宏定義直接在編譯時替換,不進行類型檢查,const聲明常量則可以進行類型檢查;
9.運算符的優(yōu)先級記憶比較麻煩,還是()可靠;
10.goto并不是一無是處,在不考慮程序可讀性的情況下可能獲得更高的效率;
11.函數(shù)實際也可以與特殊的類型相對應,那樣對于理解函數(shù)指針比較方便,函數(shù)為外部類型;
12.static用于全局變量和函數(shù)則限定該變量和函數(shù)的使用范圍僅為該源文件(從而無需考慮與其他源文件不得重名),用于函數(shù)內部變量則該變量的內存分配和回收不再同于普通臨時變量(調用函數(shù)生成,函數(shù)返回銷毀),而是一直存在于靜態(tài)變量區(qū),從而可以保存一些狀態(tài);
13.頭文件的作用體現(xiàn)在調用其他源文件時不需要再次寫函數(shù)定義,所以實現(xiàn)函數(shù)是不需要頭文件的,調用時才需要,可以采用富頭文件定義一大組接口,然后使用多個源文件分別實現(xiàn);
14.寄存器變量使用register聲明,僅適用于使用頻率高的局部變量(含形參)(受限于底層硬件,不一定會被分配到寄存器,但是這么寫不影響效率);
15.全局變量和靜態(tài)變量默認初始化為全零且僅初始化一次,局部變量默認初始化為未定義且每次都會重新初始化;
16.遞歸調用的方法一般比較緊湊,但是每次調用會單獨維護調用的`堆棧,所以效率不是最高;
17.#include的作用體現(xiàn)于將一些內容避免重新寫一遍(主要是類型、函數(shù)和外部變量定義),所以實際上不一定為h文件;
18.表示一行尚未結束,對于定義長的字符串和define比較有用;
19.函數(shù)調用的執(zhí)行順序不確定,所以對于a()+b()這樣函數(shù)中使用相同變量并且改變其值的需要借助臨時變量處理,防止不同實現(xiàn)的調用順序不一致;
20.##用于宏定義中連接前后兩個部分,如cat(a, b) a ## b;
21.指針是C/C++的重要內容,當然也是雙面刃,用好了很方便而且高效,用不好那就造成程序不穩(wěn)定;
22.使用va_list, va_start, va_arg, va_end來定義可變參數(shù)的函數(shù),通過va_start函數(shù)中的第一個不變參數(shù)將va_list指向參數(shù)列表(函數(shù)調用的棧中),然后通過va_arg獲取每個參數(shù)并將va_list移動指定類型的長度,最后則通過va_end完成必要的回收工作,需要指出的是va_arg沒有結束邊界,所以比較有效的方式有兩種,一種對于參數(shù)類型一致,則可以第一個參數(shù)指出后續(xù)參數(shù)的總數(shù),然后依次獲取,另一種對于不同類型的參數(shù)混用,則可以通過類型標識+參數(shù)配對的方式進行使用(第一個參數(shù)依然可以指定數(shù)量,當然也可以檢查標識),從而避免最后讀取無效的參數(shù),對于可變參數(shù)僅支持int和double兩種類型(參數(shù)未限定類型,故按照舊式聲明理解)以及指針類型;
23.函數(shù)指針是用來在C語言中實現(xiàn)動態(tài)調用的比較有效的方式
24.結構體用作參數(shù)依然是拷貝為形參傳遞,這點與JAVA中全部對象都是類有區(qū)別(類的對象通過引用傳值,C#支持struct),所以對于大的結構體事宜使用指針傳遞,而對于小的結構體拷貝傳值效率并不低;
25.代碼中字符數(shù)組為靜態(tài)常量,對其操作無效,程序塊中數(shù)組的聲明是可以自動回收的,通過malloc/calloc分配的內存為堆內存,需要自行通過free回收;
在C語言中,函數(shù)中要用數(shù)組做參數(shù),可以采用三種方式,其中后兩種均可適用于變長數(shù)組參數(shù)。
1 直接以定長數(shù)組做參數(shù),聲明形式為:
ret_type func(int a[100]);
這里就是以100個元素的數(shù)組做參數(shù)的。
2 聲明時不帶長度,即:
ret_type func(int a[]);
3 以指針替代數(shù)組,即:
ret_type func(int *a);
2,3兩種均可以用于變長數(shù)組。不過這種情況下,需要與函數(shù)約定數(shù)組長度的確定方法,比如約定規(guī)模 ,約定結束值,增加額外參數(shù)傳長度,在數(shù)組元素中包含長度,或采用全局變量傳長度等等。
當然可以,最典型的就是printf函數(shù)了,這個函數(shù)采用的就是可以改變形參數(shù)量的方法,百度上搜索:“C語言不定參數(shù)”就可以查到相關信息了C語言中的不定參數(shù)
這個錯誤是你聲明的某些變量占用空間太大,沒可用的空間,就會占用操作系統(tǒng)內存空間,建議你別聲明三維數(shù)組
__VA_ARGS__ 是一個可變參數(shù)的宏,這個可變參數(shù)的宏是新的C99規(guī)范中新增的。
GCC、VC2005開始支持。
#define CALCSUM(v, ...)? ?sum(v, __VA_ARGS__)
int sum(int num_args, ...)
{
int val = 0;
va_list ap;
int i;
va_start(ap, num_args);
for (i = 0; i num_args; i++)
{
val += va_arg(ap, int);
}
va_end(ap);
return val;
}
int main(void)
{
printf("10、20 和 30 的和 = %d\n", CALCSUM(3, 10, 20, 30));
printf("4、20、25 和 30 的和 = %d\n", CALCSUM(4, 4, 20, 25, 30));
return 0;
}
要求出傳入?yún)?shù)的總長度容易,代碼附下(只做了%s%d%c的支持,其他可以自己做)。
但你申請了buf后,還要把這些變量拷到str中,需要考慮統(tǒng)計的時候把每個變量的長度和指針保存下來,申請buf空間后,直接copy即可,省得再取一次變量。這一塊沒有替你考慮。
while (*fmt) {
if (*fmt++ != '%') {
nsize++;
continue;
}
switch (*fmt++) {
case 'd':
i = va_arg(marker, int);
do {
nsize++;
} while (i/=10);
break;
case 'c':
c = (char)va_arg(marker, int);
nsize++;
break;
case 's':
s = va_arg(marker, char *);
nsize += strlen(s);
break;
default:
printf("in default\n");
break;
}
}
網站題目:c語言定義可變參數(shù)的函數(shù) C++ 可變參數(shù)
文章URL:http://m.kartarina.com/article42/dodsghc.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供做網站、建站公司、網站制作、網站維護、ChatGPT、微信小程序
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)