日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2025/3/15 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 总结一些C/C++的知识点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1 指針和引用的區別

  • 指針是一個變量,這個變量里存放一個地址,指向內存的一個存儲單元,引用只是一個變量的別名;
  • 指針可以為NULL,引用不可為空必須初始化;
  • 指針的值初始化之后可以改變,引用初始化之后不可以改變;
  • 可以有多級指針不可以有多級引用;
  • sizeof指針,得到指針本身自己的大小,32位系統是4,64位系統是8,sizeof引用,得到指向對象的大小。
  • 2 靜態變量和普通變量的區別

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

    是把數據從用戶空間拷貝到內核空間緩沖區這段時間而言的。

    如果發送緩沖區剩余空間> 想要發送data字節數

    阻塞非阻塞都會將數據拷貝到內核,并且大小就是想要發送數據的大小;

    如果發送緩沖區剩余空間< 想要發送data字節數

    阻塞模式

    會阻塞,等到內核緩沖區有足夠的空閑空間,再繼續將數據拷貝到內核,直到拷貝完,返回值就是發送數據的數據量;

    非阻塞模式

    當內核緩沖區被填滿后立即返回,返回值是已經拷貝到發送緩沖區的數據量。

    5 static關鍵字的作用

    在面向過程的編程中

    隱藏。在變量或者函數前加上static,只是對本文件可見,對其他文件不可見。

    只初始化一次,并且默認初始化為0

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

    面向對象的編程

    類的靜態成員函數是屬于整個類而非類的對象,所以它沒有this指針,僅能訪問類的靜態數據和靜態成員函數。

    不能將靜態成員函數定義為虛函數。

    在類中定義static相當于一個全局變量,但是一定在類外進行初始化,

    int son::num=222;

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

    6 const作用

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

    便于進行類型檢查,保護被修飾的東西,防止意外的修改,如

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

    const定義的常量在程序運行過程中只有一份拷貝,

    修飾指針

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

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

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

    修飾引用

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

    修飾函數的返回值

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

    修飾類的成員變量

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

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

    extern const inti; //正確的引用

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

    提高了效率

    編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

    7 斐波那契數列求時間復雜度

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

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

    b數據規模

    f(n)單次過程的時間復雜度

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

    ② < f(n) O()

    8 break :跳出當前循環或者switch語句

    Continue:結束當前循環,開始下一輪循環

    9、斐波那契數列求第n項

    注意只要用到后一項等于幾的情況都要考慮斐波那契數列。

    下一項等于前兩項的和

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

    10、結構與聯合有和區別?

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

    答案:全局對象的構造函數會在main 函數之前執行。

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

    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有什么優點?

  • const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤(邊際效應)。
  • 有些集成化的調試工具可以對 const 常量進行調試,但是不能對宏常量進行調試。
  • 14.全局變量和局部變量有什么區別?是怎么實現的?操作系統和編譯器是怎么知道的?

    生命周期不同:

    全局變量隨主程序創建而創建,隨主程序銷毀而銷毀;

    局部變量在局部函數內部,甚至局部循環體等內部存在,退出就不存在;

    使用方式不同:

    通過聲明后全局變量程序的各個部分都可以用到;

    局部變量只能在局部使用;分配在棧區。

    操作系統和編譯器通過內存分配的位置來知道的,全局變量分配在全局數據段并且在程序開始運行的時候被加載。局部變量則分配在堆棧里面。

    15. 什么時候需要“引用”?

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

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

    16. extern “C”

    在C++ 程序中調用被C 編譯器編譯后的函數,為什么要加extern “C”?

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

    使用的時候,是在模塊的頭文件中,對本模塊提供給其它模塊引用的函數和全局變量以關鍵字extern聲明。

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

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

    C++支持函數重載,而過程式語言C則不支持。

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

    該函數被C編譯器編譯后在符號庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int這樣的名字包含了函數名、函數參數數量及類型信息,C++就是靠這種機制來實現函數重載的。

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

    實現C++與C及其它語言的混合編程。

    明白了C++中extern"C"的設立動機,我們下面來具體分析extern "C"通常的使用技巧:

    extern "C"的慣用法

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

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

    而在C語言的頭文件中,對其外部函數只能指定為extern類型,C語言中不支持extern"C"聲明,在.c文件中包含了extern "C"時會出現編譯語法錯誤。

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

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

    如果C++調用一個C語言編寫的.DLL時,當包括.DLL的頭文件或聲明接口函數時,應加extern"C" { }。

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

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

    17 面向對象和面向過程的區別?

    面向對象的三個特點是封裝,繼承和多態。

    ①封裝性上

    面向對象的封裝:將一系列的數據和方法封裝在類中;

    面向過程的封裝:數據用struct封裝,方法不封裝,方法和數據是分離的。

    ②代碼復用上

    面向對象:利用繼承的方式服用;

    面向過程:只能以普通的函數復用。

    18 map,set的底層實現?

    Map和set都是STL中的關聯容器,內部采用的就是一種非常高效的平衡檢索二叉樹:紅黑樹來實現的;

    Map內部自建一顆紅黑樹,這棵樹具有對數據自動排序的功能,所以map內部所有的數據都是有序的;一個map是一鍵值對序列,

    紅黑樹是結合了鏈表添加刪除方便;和數組查找效率高的優點,所以map應用起來方便高效。

    19 map,set的區別?

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

    ①Map和set都是屬于STL中的關聯容器,

    MAP的節點是一對數據.;使用關鍵值Key來唯一標識每一個成員 map可以重復;

    SET的節點是一個數據,set是一個集合 。

    只不過,map的形式 map<type1, type2> mymap;

    set的形式 set<type> myset;

    ②map是映射集合中的元素不能重復,set可以進行集合的各種操作(交并補等),當然set一般是用平衡樹或哈西表實現的。

    List特點:元素有放入順序,元素可重復

    Map特點:元素按鍵值對存儲,無放入順序

    Set特點:元素無放入順序,元素不可重復(注意:元素雖然無放入順序,但是元素在 set中的位置是有該元素的HashCode決定的,其位置其實是固定的)

    如果大家對C/C++感興趣的話,可以加一下我們的學習交流Q群:637 ?935 ?295,免費領取一套學習資料和視頻課程喲~

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。