日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

总结一些C/C++的知识点

發(fā)布時(shí)間:2025/3/15 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 总结一些C/C++的知识点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

1 指針和引用的區(qū)別

  • 指針是一個(gè)變量,這個(gè)變量里存放一個(gè)地址,指向內(nèi)存的一個(gè)存儲(chǔ)單元,引用只是一個(gè)變量的別名;
  • 指針可以為NULL,引用不可為空必須初始化;
  • 指針的值初始化之后可以改變,引用初始化之后不可以改變;
  • 可以有多級(jí)指針不可以有多級(jí)引用;
  • sizeof指針,得到指針本身自己的大小,32位系統(tǒng)是4,64位系統(tǒng)是8,sizeof引用,得到指向?qū)ο蟮拇笮 ?/li>

    2 靜態(tài)變量和普通變量的區(qū)別

  • static全局變量只初始化一次,防止其他文件單元被引用;
  • static局部變量只初始化一次,下一次依據(jù)上一次的結(jié)果值;而普通變量在下一次調(diào)用時(shí)還是用初始化的值;
  • static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每一次被調(diào)用中維持一份復(fù)制品。
  • 4 阻塞和非阻塞

    是把數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間緩沖區(qū)這段時(shí)間而言的。

    如果發(fā)送緩沖區(qū)剩余空間> 想要發(fā)送data字節(jié)數(shù)

    阻塞非阻塞都會(huì)將數(shù)據(jù)拷貝到內(nèi)核,并且大小就是想要發(fā)送數(shù)據(jù)的大小;

    如果發(fā)送緩沖區(qū)剩余空間< 想要發(fā)送data字節(jié)數(shù)

    阻塞模式

    會(huì)阻塞,等到內(nèi)核緩沖區(qū)有足夠的空閑空間,再繼續(xù)將數(shù)據(jù)拷貝到內(nèi)核,直到拷貝完,返回值就是發(fā)送數(shù)據(jù)的數(shù)據(jù)量;

    非阻塞模式

    當(dāng)內(nèi)核緩沖區(qū)被填滿后立即返回,返回值是已經(jīng)拷貝到發(fā)送緩沖區(qū)的數(shù)據(jù)量。

    5 static關(guān)鍵字的作用

    在面向過(guò)程的編程中

    隱藏。在變量或者函數(shù)前加上static,只是對(duì)本文件可見(jiàn),對(duì)其他文件不可見(jiàn)。

    只初始化一次,并且默認(rèn)初始化為0

    如果作為static局部變量在函數(shù)內(nèi)定義,它的生存期為整個(gè)源程序,但是其作用域是定義該變量的函數(shù),只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后,盡管該變量還繼續(xù)存在,但不能使用它。

    面向?qū)ο蟮木幊?/p>

    類的靜態(tài)成員函數(shù)是屬于整個(gè)類而非類的對(duì)象,所以它沒(méi)有this指針,僅能訪問(wèn)類的靜態(tài)數(shù)據(jù)和靜態(tài)成員函數(shù)。

    不能將靜態(tài)成員函數(shù)定義為虛函數(shù)。

    在類中定義static相當(dāng)于一個(gè)全局變量,但是一定在類外進(jìn)行初始化,

    int son::num=222;

    在不聲明類對(duì)象就能使用類中的變量和函數(shù),只需要在前面加上作用域就可以;

    6 const作用

    可以定義const常量,如const int Max = 100;

    便于進(jìn)行類型檢查,保護(hù)被修飾的東西,防止意外的修改,如

    void f(const int i){...}編譯器就會(huì)知道i是一個(gè)常量,不允許修改

    const定義的常量在程序運(yùn)行過(guò)程中只有一份拷貝,

    修飾指針

    const int *A; //const修飾指向的對(duì)象,A可變,A指向的對(duì)象不可變

    int *const A; //const修飾指針A,A不可變,A指向的對(duì)象可變

    const int *constA; //指針A和A指向的對(duì)象都不可變

    修飾引用

    const double &A; //該引用所引用的對(duì)象不能被更新

    修飾函數(shù)的返回值

    是返回值不可被改變,格式如下:constint Fun1();

    修飾類的成員變量

    int Fun() const;這樣,函數(shù)Fun中不能修改類里面的數(shù)據(jù)。

    在另一連接文件中引用const常量

    extern const inti; //正確的引用

    extern const int j =10;//錯(cuò)誤,常量不可以被再次賦值

    提高了效率

    編譯器通常不為普通const常量分配存儲(chǔ)空間,而是將它們保存在符號(hào)表中,這使得它成為一個(gè)編譯期間的常量,沒(méi)有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高。

    7 斐波那契數(shù)列求時(shí)間復(fù)雜度

    例T(n) = 2T(n/2)+1,其時(shí)間復(fù)雜度是O(n);

    公式:T(n) = aT(n/b)+f(n); a遞歸調(diào)用次數(shù)

    b數(shù)據(jù)規(guī)模

    f(n)單次過(guò)程的時(shí)間復(fù)雜度

    比較 和f(n) ① > f(n) 時(shí)間復(fù)雜度是:O()

    ② < f(n) O()

    8 break :跳出當(dāng)前循環(huán)或者switch語(yǔ)句

    Continue:結(jié)束當(dāng)前循環(huán),開始下一輪循環(huán)

    9、斐波那契數(shù)列求第n項(xiàng)

    注意只要用到后一項(xiàng)等于幾的情況都要考慮斐波那契數(shù)列。

    下一項(xiàng)等于前兩項(xiàng)的和

    下一項(xiàng)等于前(n-1)項(xiàng)的和

    10、結(jié)構(gòu)與聯(lián)合有和區(qū)別?

  • 結(jié)構(gòu)和聯(lián)合都是由多個(gè)不同的數(shù)據(jù)類型成員組成, 但在任何同一時(shí)刻, 聯(lián)合中只存放了一個(gè)被選中的成員(所有成員共用一塊地址空間), 而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同)。
  • 對(duì)于聯(lián)合的不同成員賦值, 將會(huì)對(duì)其它成員重寫, 原來(lái)成員的值就不存在了, 而對(duì)于結(jié)構(gòu)的不同成員賦值是互不影響的。
  • 11、main 函數(shù)執(zhí)行以前,還會(huì)執(zhí)行什么代碼?

    答案:全局對(duì)象的構(gòu)造函數(shù)會(huì)在main 函數(shù)之前執(zhí)行。

    12.分別寫出BOOL,int,float,指針類型的變量a 與“零”的比較語(yǔ)句。

    BOOL : if ( !a ) or if(a) Int : if ( a == 0) float : const EXPRESSION EXP = 0.000001 if ( a < EXP && a >-EXP) pointer : if ( a != NULL) or if(a == NULL)

    13.const與 #define 的比較,const有什么優(yōu)點(diǎn)?

  • const 常量有數(shù)據(jù)類型,而宏常量沒(méi)有數(shù)據(jù)類型。編譯器可以對(duì)前者進(jìn)行類型安全檢查。而對(duì)后者只進(jìn)行字符替換,沒(méi)有類型安全檢查,并且在字符替換可能會(huì)產(chǎn)生意料不到的錯(cuò)誤(邊際效應(yīng))。
  • 有些集成化的調(diào)試工具可以對(duì) const 常量進(jìn)行調(diào)試,但是不能對(duì)宏常量進(jìn)行調(diào)試。
  • 14.全局變量和局部變量有什么區(qū)別?是怎么實(shí)現(xiàn)的?操作系統(tǒng)和編譯器是怎么知道的?

    生命周期不同:

    全局變量隨主程序創(chuàng)建而創(chuàng)建,隨主程序銷毀而銷毀;

    局部變量在局部函數(shù)內(nèi)部,甚至局部循環(huán)體等內(nèi)部存在,退出就不存在;

    使用方式不同:

    通過(guò)聲明后全局變量程序的各個(gè)部分都可以用到;

    局部變量只能在局部使用;分配在棧區(qū)。

    操作系統(tǒng)和編譯器通過(guò)內(nèi)存分配的位置來(lái)知道的,全局變量分配在全局?jǐn)?shù)據(jù)段并且在程序開始運(yùn)行的時(shí)候被加載。局部變量則分配在堆棧里面。

    15. 什么時(shí)候需要“引用”?

    流操作符<<和>>、賦值操作符=的返回值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符=的參數(shù)、其它情況都推薦使用引用。

    以上 2-8 參考:http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx

    16. extern “C”

    在C++ 程序中調(diào)用被C 編譯器編譯后的函數(shù),為什么要加extern “C”?

    extern是C/C++語(yǔ)言中表明函數(shù)和全局變量作用范圍的關(guān)鍵字,該關(guān)鍵字告訴編譯器, 其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。

    使用的時(shí)候,是在模塊的頭文件中,對(duì)本模塊提供給其它模塊引用的函數(shù)和全局變量以關(guān)鍵字extern聲明。

    例如,如果模塊B欲引用該模塊A中定義的全局變量和函數(shù)時(shí),需要在A的頭文件中把B想要引用的A的全局變量和函數(shù)前面加上extern,而B在使用的時(shí)候只需包含模塊A的頭文件即可。

    extern "C"用于C++要使用C的變量和函數(shù)的時(shí)候,是連接申明,被extern "C"修飾的變量和函數(shù)是按照C語(yǔ)言方式編譯和連接的。

    C++支持函數(shù)重載,而過(guò)程式語(yǔ)言C則不支持。

    例如,假設(shè)某個(gè)函數(shù)的原型為: voidfoo( int x, int y );

    該函數(shù)被C編譯器編譯后在符號(hào)庫(kù)中的名字為_foo,而C++編譯器則會(huì)產(chǎn)生像_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息,C++就是靠這種機(jī)制來(lái)實(shí)現(xiàn)函數(shù)重載的。

    例如,在C++中,函數(shù)void foo( int x,int y )與void foo( int x,float y )編譯生成的符號(hào)是不相同的,后者為_foo_int_float。

    實(shí)現(xiàn)C++與C及其它語(yǔ)言的混合編程。

    明白了C++中extern"C"的設(shè)立動(dòng)機(jī),我們下面來(lái)具體分析extern "C"通常的使用技巧:

    extern "C"的慣用法

    (1)在C++中引用C語(yǔ)言中的函數(shù)和變量,在包含C語(yǔ)言頭文件(假設(shè)為cExample.h)時(shí),需進(jìn)行下列處理:

    extern "C" { #i nclude"cExample.h" }

    而在C語(yǔ)言的頭文件中,對(duì)其外部函數(shù)只能指定為extern類型,C語(yǔ)言中不支持extern"C"聲明,在.c文件中包含了extern "C"時(shí)會(huì)出現(xiàn)編譯語(yǔ)法錯(cuò)誤。

    C++引用C函數(shù)例子工程中包含的三個(gè)文件的源代碼如下:

    /* c語(yǔ)言頭文件:cExample.h */ #ifndef C_EXAMPLE_H #define C_EXAMPLE_H extern int add(int x,int y); #endif /* c語(yǔ)言實(shí)現(xiàn)文件:cExample.c */ #i nclude"cExample.h" int add( int x, int y ) { return x + y; } // c++實(shí)現(xiàn)文件,調(diào)用add:cppFile.cpp extern "C" { #i nclude"cExample.h" } int main(int argc, char* argv[]) { add(2,3); return 0; }

    如果C++調(diào)用一個(gè)C語(yǔ)言編寫的.DLL時(shí),當(dāng)包括.DLL的頭文件或聲明接口函數(shù)時(shí),應(yīng)加extern"C" { }。

    (2)在C中引用C++語(yǔ)言中的函數(shù)和變量時(shí),C++的頭文件需添加extern"C",但是在C語(yǔ)言中不能直接引用聲明了extern "C"的該頭文件,應(yīng)該僅將C文件中將C++中定義的extern "C"函數(shù)聲明為extern類型。

    C引用C++函數(shù)例子工程中包含的三個(gè)文件的源代碼如下: //C++頭文件 cppExample.h #ifndef CPP_EXAMPLE_H #define CPP_EXAMPLE_H extern "C" int add( int x, int y ); #endif //C++實(shí)現(xiàn)文件 cppExample.cpp #i nclude"cppExample.h" int add( int x, int y ) { return x + y; } /* C實(shí)現(xiàn)文件 cFile.c /* 這樣會(huì)編譯出錯(cuò):#i nclude "cExample.h" */ extern int add( int x, int y ); int main( int argc, char* argv[] ) { add( 2, 3 ); return 0; }

    17 面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別?

    面向?qū)ο蟮娜齻€(gè)特點(diǎn)是封裝,繼承和多態(tài)。

    ①封裝性上

    面向?qū)ο蟮姆庋b:將一系列的數(shù)據(jù)和方法封裝在類中;

    面向過(guò)程的封裝:數(shù)據(jù)用struct封裝,方法不封裝,方法和數(shù)據(jù)是分離的。

    ②代碼復(fù)用上

    面向?qū)ο?#xff1a;利用繼承的方式服用;

    面向過(guò)程:只能以普通的函數(shù)復(fù)用。

    18 map,set的底層實(shí)現(xiàn)?

    Map和set都是STL中的關(guān)聯(lián)容器,內(nèi)部采用的就是一種非常高效的平衡檢索二叉樹:紅黑樹來(lái)實(shí)現(xiàn)的;

    Map內(nèi)部自建一顆紅黑樹,這棵樹具有對(duì)數(shù)據(jù)自動(dòng)排序的功能,所以map內(nèi)部所有的數(shù)據(jù)都是有序的;一個(gè)map是一鍵值對(duì)序列,

    紅黑樹是結(jié)合了鏈表添加刪除方便;和數(shù)組查找效率高的優(yōu)點(diǎn),所以map應(yīng)用起來(lái)方便高效。

    19 map,set的區(qū)別?

    vector封裝數(shù)組,list封裝了鏈表,map和set封裝了二叉樹等

    ①M(fèi)ap和set都是屬于STL中的關(guān)聯(lián)容器,

    MAP的節(jié)點(diǎn)是一對(duì)數(shù)據(jù).;使用關(guān)鍵值Key來(lái)唯一標(biāo)識(shí)每一個(gè)成員 map可以重復(fù);

    SET的節(jié)點(diǎn)是一個(gè)數(shù)據(jù),set是一個(gè)集合 。

    只不過(guò),map的形式 map<type1, type2> mymap;

    set的形式 set<type> myset;

    ②map是映射集合中的元素不能重復(fù),set可以進(jìn)行集合的各種操作(交并補(bǔ)等),當(dāng)然set一般是用平衡樹或哈西表實(shí)現(xiàn)的。

    List特點(diǎn):元素有放入順序,元素可重復(fù)

    Map特點(diǎn):元素按鍵值對(duì)存儲(chǔ),無(wú)放入順序

    Set特點(diǎn):元素?zé)o放入順序,元素不可重復(fù)(注意:元素雖然無(wú)放入順序,但是元素在 set中的位置是有該元素的HashCode決定的,其位置其實(shí)是固定的)

    如果大家對(duì)C/C++感興趣的話,可以加一下我們的學(xué)習(xí)交流Q群:637 ?935 ?295,免費(fèi)領(lǐng)取一套學(xué)習(xí)資料和視頻課程喲~

    總結(jié)

    以上是生活随笔為你收集整理的总结一些C/C++的知识点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。