<kbd id="daqct"></kbd>

  • <nav id="daqct"></nav>
    <wbr id="daqct"><pre id="daqct"></pre></wbr>
    <wbr id="daqct"></wbr>
    <form id="daqct"><th id="daqct"></th></form>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    C/C++編程語言基礎知識總結

    • 發布:C++培訓
    • 來源:學習筆記
    • 時間:2017-08-21 13:53

    編程基礎

    C/C++的內容又多又雜,常常看到有人羅列相關書單,覺得毫無意義,我不相信他們真的完全掌握了其中任何一本。學習任何東西,首先要掌握基本概念,基礎不牢地動山搖,因為高級的內容都是通過低級的概念來描述的。當基本概念都沒理解透,學習再多都是空中樓閣。這里羅列了一些聽基本的問題,雖然看著不難,但是精確理解每句話中的每個詞真的并不容易。

    變量聲明和定義區別?

    聲明僅僅是把變量的聲明的位置及類型提供給編譯器,并不分配內存空間;定義要在定義的地方為其分配存儲空間。

    相同變量可以再多處聲明(外部變量extern),但只能在一處定義。

    "零值比較"?

    bool類型:if(flag)

    int類型:if(flag == 0)

    指針類型:if(flag == null)

    float類型:if((flag >= -0.000001) && (flag <= 0. 000001))

    strlen和sizeof區別?

    sizeof是運算符,并不是函數,結果在編譯時得到而非運行中獲得;strlen是字符處理的庫函數。

    sizeof參數可以是任何數據的類型或者數據(sizeof參數不退化);strlen的參數只能是字符指針且結尾是'\0'的字符串。

    同一結構體不同對象可以互相賦值嗎?

    可以,但含有指針成員時需要注意。

    對比類的對象賦值時深拷貝和淺拷貝。

    結構體內存對齊問題?

    結構體內成員按照聲明順序存儲,第一個成員地址和整個結構體地址相同。

    未特殊說明時,按結構體中size最大的成員對齊(若有double成員),按8字節對齊。

    static作用是什么?在C和C++中有何區別?

    static可以修飾局部變量(靜態局部變量)、全局變量(靜態全局變量)和函數,被修飾的變量存儲位置在靜態區。對于靜態局部變量,相對于一般局部變量其生命周期長,直到程序運行結束而非函數調用結束,且只在第一次被調用時定義;對于靜態全局變量,相對于全局變量其可見范圍被縮小,只能在本文件中可見;修飾函數時作用和修飾全局變量相同,都是為了限定訪問域。

    C++的static除了上述兩種用途,還可以修飾類成員(靜態成員變量和靜態成員函數),靜態成員變量和靜態成員函數不屬于任何一個對象,是所有類實例所共有。

    static的數據記憶性可以滿足函數在不同調用期的通信,也可以滿足同一個類的多個實例間的通信。

    未初始化時,static變量默認值為0。

    結構體和類的區別?

    結構體的默認限定符是public;類是private。

    結構體不可以繼承,類可以。

    malloc和new的區別?

    malloc和free是標準庫函數,支持覆蓋;new和delete是運算符,并且支持重載。

    malloc僅僅分配內存空間,free僅僅回收空間,不具備調用構造函數和析構函數功能,用malloc分配空間存儲類的對象存在風險;new和delete除了分配回收功能外,還會調用構造函數和析構函數。

    malloc和free返回的是void類型指針(必須進行類型轉換),new和delete返回的是具體類型指針。

    指針和引用區別?

    引用只是別名,不占用具體存儲空間,只有聲明沒有定義;指針時具體變量,需要占用存儲空間。

    引用在聲明時必須初始化為另一變量,一旦出現必須為typename refname &varname形式;指針聲明和定義可以分開,可以先只聲明指針變量而不初始化,等用到時再指向具體變量。

    引用一旦初始化之后就不可以再改變;指針變量可以重新指向別的變量。

    不存在指向空值的引用,必須有具體實體;但是存在指向空值的指針。

    宏定義和函數有何區別?

    宏在編譯時完成替換,之后被替換的文本參與編譯,相當于直接插入了代碼,運行時不存在函數調用,執行起來更快;函數調用在運行時需要跳轉到具體調用函數。

    宏函數屬于在結構中插入代碼,沒有返回值;函數調用具有返回值。

    宏函數參數沒有類型,不進行類型檢查;函數參數具有類型,需要檢查類型。

    宏函數不要在最后加分號。

    宏定義和const區別?

    宏替換發生在編譯階段之前,屬于文本插入替換;const作用發生于編譯過程中。

    宏不檢查類型;const會檢查數據類型。

    宏定義的數據沒有分配內存空間,只是插入替換掉;const定義的變量只是值不能改變,但要分配內存空間。

    宏定義和typedef區別?

    宏主要用于定義常量及書寫復雜的內容;typedef主要用于定義類型別名。

    宏替換發生在編譯階段之前,屬于文本插入替換;typedef是編譯的一部分。

    宏不檢查類型;typedef會檢查數據類型。

    宏不是語句,不在在最后加分號;typedef是語句,要加分號標識結束。

    注意對指針的操作,typedef char * p_char和#define p_char char *區別巨大。

    宏定義和內聯函數(inline)區別?

    在使用時,宏只做簡單字符串替換(編譯前)。而內聯函數可以進行參數類型檢查(編譯時),且具有返回值。

    內聯函數本身是函數,強調函數特性,具有重載等功能。

    內聯函數可以作為某個類的成員函數,這樣可以使用類的保護成員和私有成員。而當一個表達式涉及到類保護成員或私有成員時,宏就不能實現了。

    條件編譯#ifdef, #else, #endif作用?

    可以通過加#define,并通過#ifdef來判斷,將某些具體模塊包括進要編譯的內容。

    用于子程序前加#define DEBUG用于程序調試。

    應對硬件的設置(機器類型等)。

    條件編譯功能if也可實現,但條件編譯可以減少被編譯語句,從而減少目標程序大小。

    區別以下幾種變量?

    const int a;

    int const a;

    const int *a;

    int *const a;

    int const a和const int a均表示定義常量類型a。

    const int *a,其中a為指向int型變量的指針,const在 * 左側,表示a指向不可變常量。(看成const (*a),對引用加const)

    int *const a,依舊是指針類型,表示a為指向整型數據的常指針。(看成const(a),對指針const)

    volatile有什么作用?

    volatile定義變量的值是易變的,每次用到這個變量的值的時候都要去重新讀取這個變量的值,而不是讀寄存器內的備份。

    多線程中被幾個任務共享的變量需要定義為volatile類型。

    什么是常引用?

    常引用可以理解為常量指針,形式為const typename & refname = varname。

    常引用下,原變量值不會被別名所修改。

    原變量的值可以通過原名修改。

    常引用通常用作只讀變量別名或是形參傳遞。

    區別以下指針類型?

    int *p[10]

    int (*p)[10]

    int *p(int)

    int (*p)(int)

    int *p[10]表示指針數組,強調數組概念,是一個數組變量,數組大小為10,數組內每個元素都是指向int類型的指針變量。

    int (*p)[10]表示數組指針,強調是指針,只有一個變量,是指針類型,不過指向的是一個int類型的數組,這個數組大小是10。

    int *p(int)是函數聲明,函數名是p,參數是int類型的,返回值是int *類型的。

    int (*p)()是函數指針,強調是指針,該指針指向的函數具有int類型參數,并且返回值是int類型的。

    常量指針和指針常量區別?

    常量指針是一個指針,讀成常量的指針,指向一個只讀變量。如int const *p或const int *p。

    指針常量是一個不能給改變指向的指針。如int *const p。

    a和&a有什么區別?

    假設數組int a[10];

    int (*p)[10] = &a;

    a是數組名,是數組首元素地址,+1表示地址值加上一個int類型的大小,如果a的值是0x00000001,加1操作后變為0x00000005。*(a + 1) = a[1]。

    &a是數組的指針,其類型為int (*)[10](就是前面提到的數組指針),其加1時,系統會認為是數組首地址加上整個數組的偏移(10個int型變量),值為數組a尾元素后一個元素的地址。

    若(int *)p ,此時輸出 *p時,其值為a[0]的值,因為被轉為int *類型,解引用時按照int類型大小來讀取。

    數組名和指針區別?

    數組名不是真正意義上的指針,可以理解為常指針,所以數組名沒有自增、自減等操作。

    當數組名當做形參傳遞給調用函數后,就失去了原有特性,退化成一般指針,多了自增、自減操作,但sizeof運算符不能再得到原數組的大小了。

    野指針是什么?

    指針變量未及時初始化 => 定義指針變量及時初始化,要么置空。

    指針free或delete之后沒有及時置空 => 釋放操作后立即置空。

    也叫空懸指針,不是指向null的指針,是指向垃圾內存的指針。

    產生原因及解決辦法:

    堆和棧的區別?

    棧由系統分配,速度快,不會有碎片。

    堆由程序員分配,速度慢,且會有碎片。

    棧頂和棧底是之前預設好的,大小固定,可以通過ulimit -a查看,由ulimit -s修改。

    堆向高地址擴展,是不連續的內存區域,大小可以靈活調整。

    棧由系統自動分配。

    堆由程序員手動分配。

    申請方式不同。

    申請大小限制不同。

    申請效率不同。

    delete和delete[]區別?

    delete只會調用一次析構函數。

    delete[]會調用數組中每個元素的析構函數。

    面向對象基礎

    能夠準確理解下面這些問題是從C程序員向C++程序員進階的基礎。當然了,這只是一部分。

    面向對象三大特性?

    封裝性:數據和代碼捆綁在一起,避免外界干擾和不確定性訪問。

    繼承性:讓某種類型對象獲得另一個類型對象的屬性和方法。

    多態性:同一事物表現出不同事物的能力(重載實現編譯時多態,虛函數實現運行時多態)。

    public/protected/private的區別?

    public的變量和函數在類的內部外部都可以訪問。

    protected的變量和函數只能在類的內部和其派生類中訪問。

    private修飾的元素只能在類內訪問。

    對象存儲空間?

    非靜態成員的數據類型大小之和。

    編譯器加入的額外成員變量(如指向虛函數的指針)。

    為了邊緣對齊優化加入的panding。

    C++空類有哪些成員函數?

    構造函數

    析構函數

    拷貝構造函數

    賦值運算符

    首先,空類大小為1字節。

    默認函數有:

    構造函數能否為虛函數,析構函數呢?

    構造函數不能定義為虛函數,不僅如此,構造函數中還不能調用虛函數。因為那樣實際執行的是父類對應的函數,因為自己還沒有構造好(構造順序先基類再派生類)。

    析構函數可以為虛函數,并且一般情況下基類析構函數要定義為虛函數。

    只有在基類析構函數定義為虛函數時,調用操作符delete銷毀指向對象的基類指針時,才能準確調用派生類的析構函數(從該級向上按序調用虛函數),才能準確銷毀數據。

    析構函數可以是純虛函數,含有純虛函數的類是抽象類,此時不能被實例化。但派生類中可以根據自身需求重新改寫基類中的純虛函數。

    析構函數:

    構造函數:

    構造函數調用順序,析構函數呢?

    基類的構造函數:如果有多個基類,先調用縱向上最上層基類構造函數,如果橫向繼承了多個類,調用順序為派生表從左到右順序。

    成員類對象的構造函數:如果類的變量中包含其他類(類的組合),需要在調用本類構造函數前先調用成員類對象的構造函數,調用順序遵照在類中被聲明的順序。

    派生類的構造函數。

    析構函數與之相反。

    拷貝構造函數中深拷貝和淺拷貝區別?

    深拷貝時,當被拷貝對象存在動態分配的存儲空間時,需要先動態申請一塊存儲空間,然后逐字節拷貝內容。

    淺拷貝僅僅是拷貝指針字面值。

    當使用淺拷貝時,如果原來的對象調用析構函數釋放掉指針所指向的數據,則會產生空懸指針。因為所指向的內存空間已經被釋放了。

    拷貝構造函數和賦值運算符重載的區別?

    注:類中有指針變量時要重寫析構函數、拷貝構造函數和賦值運算符

    拷貝構造函數是函數,賦值運算符是運算符重載。

    拷貝構造函數會生成新的類對象,賦值運算符不能。

    拷貝構造函數是直接構造一個新的類對象,所以在初始化對象前不需要檢查源對象和新建對象是否相同;賦值運算符需要上述操作并提供兩套不同的復制策略,另外賦值運算符中如果原來的對象有內存分配則需要先把內存釋放掉。

    形參傳遞是調用拷貝構造函數(調用的被賦值對象的拷貝構造函數),但并不是所有出現"="的地方都是使用賦值運算符,如下:

    Student s;

    Student s1 = 2; // 調用拷貝構造函數

    Student s2;

    s2 = s; // 賦值運算符操作

    虛函數和純虛函數區別?

    虛函數是為了實現動態編聯產生的,目的是通過基類類型的指針指向不同對象時,自動調用相應的、和基類同名的函數。虛函數需要在基類中加上virtual修飾符修飾,因為virtual會被隱式繼承,所以子類中相同函數都是虛函數。

    純虛函數只是相當于一個接口名,但含有純虛函數的類不能夠實例化。

    覆蓋、重載和隱藏的區別?

    覆蓋是派生類中重新定義的函數,其函數名、參數列表(個數、類型和順序)、返回值類型和父類完全相同,只有函數體有區別。派生類雖然繼承了基類的同名函數,但用派生類對象調用該函數時會根據對象類型調用相應的函數。覆蓋只能發生在類的成員函數中。

    隱藏是指派生類函數屏蔽了與其同名的函數,這里僅要求基類和派生類函數同名即可。其他狀態同覆蓋。可以說隱藏比覆蓋涵蓋的范圍更寬泛,畢竟參數不加限定。

    重載是具有相同函數名但參數列表不同(個數、類型或順序)的兩個函數(不關心返回值),當調用函數時根據傳遞的參數列表來確定具體調用哪個函數。重載可以是成員函數也可以是類外函數。

    在main執行之前執行的代碼可能是什么?

    全局對象的構造函數。

    哪幾種情況必須用到初始化成員列表?

    初始化一個const成員。

    初始化一個reference成員。

    調用一個基類的構造函數,而該函數有一組參數。

    調用一個數據成員對象的構造函數,而該函數有一組參數。

    什么是虛指針?

    虛指針或虛函數指針是虛函數的實現細節。

    虛指針指向虛表結構。

    標準模板庫

    STL內容雖然看起來很多,單獨成書都不是問題(《STL源碼剖析》),但從實際使用狀況來看,我認為只需要知道以下幾點就可以了:

    怎么用?

    各種STL基本的增刪改查怎么使用。每種容器都提供了很多操作,但實際增刪改查我們通常只需要掌握透徹一種方式即可。有些功能只是出于通用性考慮才存在的,但對于相應的STL這些操作完全可以忽略。所以我對STL使用的看法是,不需要花太多時間去了解所有功能,只要掌握最基本的即可,要把精力放在對需求的了解并選擇適合的數據結構。

    怎么實現?

    本身STL就是封裝了我們常用的數據結構,所以最先需要了解每種數據結構的特性。而且了解實現方式對我們能夠準確、高效使用STL打下了基礎。

    如何避免錯誤?

    在第二階段了解了STL的實現之后,我們已經可以很清楚地知道他們底層使用的是什么數據結構以及該數據結構做什么操作比較高效。但還有一點需要注意的就是怎么才能用對他們,避免一些未知的錯誤,比如迭代器失效問題。

    string

    vector

    用法:

    定義:

    vector<T> vec;

    插入元素:

    vec.push_back(element);

    vec.insert(iterator, element);

    刪除元素:

    vec.pop_back();

    vec.erase(iterator);

    修改元素:

    vec[position] = element;

    遍歷容器:

    for(auto it = vec.begin(); it != vec.end(); ++it) {......}

    其他:

    vec.empty(); //判斷是否空

    vec.size(); // 實際元素

    vec.capacity(); // 容器容量

    vec.begin(); // 獲得首迭代器

    vec.end(); // 獲得尾迭代器

    vec.clear(); // 清空

    實現:

    模擬Vector實現

    線性表,數組實現。

    支持隨機訪問。

    插入刪除操作需要大量移動數據。

    需要連續的物理存儲空間。

    每當大小不夠時,重新分配內存(*2),并復制原內容。

    錯誤避免:

    迭代器失效

    插入元素

    尾后插入:size < capacity時,首迭代器不失效尾迭代實現(未重新分配空間),size == capacity時,所有迭代器均失效(需要重新分配空間)。

    中間插入:size < capacity時,首迭代器不失效但插入元素之后所有迭代器失效,size == capacity時,所有迭代器均失效。

    刪除元素

    尾后刪除:只有尾迭代失效。

    中間刪除:刪除位置之后所有迭代失效。

    map

    用法:

    定義:

    mao<T_key, T_value> map;

    插入元素:

    map.insert(pair<T_key, T_value>(key, value)); // 同key不插入

    map.insert(map<T_key, T_value>::value_type(key, value)); // 同key不插入

    map[key] = value; // 同key覆蓋

    刪除元素:

    map.erase(key); // 按值刪

    map.erase(iterator); // 按迭代器刪

    修改元素:

    map[key] = new_value;

    遍歷容器:

    for(auto it = vec.begin(); it != vec.end(); ++it) {......}

    實現:

    RBTree實現

    樹狀結構,RBTree實現。

    插入刪除不需要數據復制。

    操作復雜度僅跟樹高有關。

    RBTree本身也是二叉排序樹的一種,key值有序,且唯一。

    必須保證key可排序。

    基于紅黑樹實現的map結構(實際上是map, set, multimap,multiset底層均是紅黑樹),不僅增刪數據時不需要移動數據,其所有操作都可以在O(logn)時間范圍內完成。另外,基于紅黑樹的map在通過迭代器遍歷時,得到的是key按序排列后的結果,這點特性在很多操作中非常方便。

    面試時候現場寫紅黑樹代碼的概率幾乎為0,但是紅黑樹一些基本概念還是需要掌握的。

    它是二叉排序樹(繼承二叉排序樹特顯):

    若左子樹不空,則左子樹上所有結點的值均小于或等于它的根結點的值。

    若右子樹不空,則右子樹上所有結點的值均大于或等于它的根結點的值。

    左、右子樹也分別為二叉排序樹。

    它滿足如下幾點要求:

    樹中所有節點非紅即黑。

    根節點必為黑節點。

    紅節點的子節點必為黑(黑節點子節點可為黑)。

    從根到NULL的任何路徑上黑結點數相同。

    查找時間一定可以控制在O(logn)。

    紅黑樹的節點定義如下:

    enum Color {

    RED = 0,

    BLACK = 1};struct RBTreeNode { struct RBTreeNode*left, *right, *parent; int key; int data;

    Color color;

    };

    所以對紅黑樹的操作需要滿足兩點:1.滿足二叉排序樹的要求;2.滿足紅黑樹自身要求。通常在找到節點通過和根節點比較找到插入位置之后,還需要結合紅黑樹自身限制條件對子樹進行左旋和右旋。

    相比于AVL樹,紅黑樹平衡性要稍微差一些,不過創建紅黑樹時所需的旋轉操作也會少很多。相比于最簡單的BST,BST最差情況下查找的時間復雜度會上升至O(n),而紅黑樹最壞情況下查找效率依舊是O(logn)。所以說紅黑樹之所以能夠在STL及Linux內核中被廣泛應用就是因為其折中了兩種方案,既減少了樹高,又減少了建樹時旋轉的次數。

    從紅黑樹的定義來看,紅黑樹從根到NULL的每條路徑擁有相同的黑節點數(假設為n),所以最短的路徑長度為n(全為黑節點情況)。因為紅節點不能連續出現,所以路徑最長的情況就是插入最多的紅色節點,在黑節點數一致的情況下,最可觀的情況就是黑紅黑紅排列......最長路徑不會大于2n,這里路徑長就是樹高。

    set

    編譯及調試

    編譯

    預處理

    展開所有的宏定義,完成字符常量替換。

    處理條件編譯語句,通過是否具有某個宏來決定過濾掉哪些代碼。

    處理#include指令,將被包含的文件插入到該指令所在位置。

    過濾掉所有注釋語句。

    添加行號和文件名標識。

    保留所有#pragma編譯器指令。

    編譯

    詞法分析。

    語法分析。

    語義分析。

    中間語言生成。

    目標代碼生成與優化。

    鏈接

    各個源代碼模塊獨立的被編譯,然后將他們組裝起來成為一個整體,組裝的過程就是鏈接。被鏈接的各個部分本本身就是二進制文件,所以在被鏈接時需要將所有目標文件的代碼段拼接在一起,然后將所有對符號地址的引用加以修正。

    靜態鏈接

    靜態鏈接最簡單的情況就是在編譯時和靜態庫鏈接在一起成為完整的可執行程序。這里所說的靜態庫就是對多個目標文件(.o)文件的打包,通常靜態鏈接的包名為lib****.a,靜態鏈接所有被用到的目標文件都會復制到最終生成的可執行目標文件中。這種方式的好處是在運行時,可執行目標文件已經完全裝載完畢,只要按指令序執行即可,速度比較快,但缺點也有很多,在講動態鏈接時會比較一下。

    既然靜態鏈接是對目標文件的打包,這里介紹些打包命令。

    gcc -c test1.c // 生成test1.o

    gcc -c test2.c // 生成test2.c

    ar cr libtest.a test1.o test2.o

    首先編譯得到test1.o和test2.o兩個目標文件,之后通過ar命令將這兩個文件打包為.a文件,文件名格式為lib + 靜態庫名 + .a后綴。在生成可執行文件需要使用到它的時候只需要在編譯時加上即可。需要注意的是,使用靜態庫時加在最后的名字不是libtest.a,而是l + 靜態庫名。

    gcc -o main main.c -ltest

    動態鏈接

    靜態鏈接發生于編譯階段,加載至內存前已經完整,但缺點是如果多個程序都需要使用某個靜態庫,則該靜態庫會在每個程序中都拷貝一份,非常浪費內存資源,所以出現了動態鏈接的方式來解決這個問題。

    動態鏈接在形式上倒是和靜態鏈接非常相似,首先也是需要打包,打包成動態庫,不過文件名格式為lib + 動態庫名 + .so后綴。不過動態庫的打包不需要使用ar命令,gcc就可以完成,但要注意在編譯時要加上-fPIC選項,打包時加上-shared選項。

    gcc -fPIC -c test1.c

    gcc -fPIC -c test2.c

    gcc -shared test1.o test2.o -o libtest.so

    使用動態鏈接的用法也和靜態鏈接相同。

    gcc -o main main.c -ltest

    如果僅僅像上面的步驟是沒有辦法正常使用庫的,我們可以通過加-Lpath指定搜索庫文件的目錄(-L.表示當前目錄),默認情況下會到環境變量LD_LIBRARY_PATH指定的目錄下搜索庫文件,默認情況是/usr/lib,我們可以將庫文件拷貝到那個目錄下再鏈接。

    比較靜態庫和動態庫我們可以得到二者的優缺點。

    動態庫運行時會先檢查內存中是否已經有該庫的拷貝,若有則共享拷貝,否則重新加載動態庫(C語言的標準庫就是動態庫)。靜態庫則是每次在編譯階段都將靜態庫文件打包進去,當某個庫被多次引用到時,內存中會有多份副本,浪費資源。

    動態庫另一個有點就是更新很容易,當庫發生變化時,如果接口沒變只需要用新的動態庫替換掉就可以了。但是如果是靜態庫的話就需要重新被編譯。

    不過靜態庫也有優點,主要就是靜態庫一次性完成了所有內容的綁定,運行時就不必再去考慮鏈接的問題了,執行效率會稍微高一些。

    makefile編寫

    對于大的工程通常涉及很多頭文件和源文件,編譯起來很很麻煩,makefile正是為了自動化編譯產生的,makefile像是編譯說明書,指示編譯的步驟和條件,之后被make命令解釋。

    基本規則

    A:B

    (tab)<command>

    其中A是語句最后生成的文件,B是生成A所依賴的文件,比如生成test.o依賴于test.c和test.h,則寫成test.o:test.c test.h。接下來一行的開頭必須是tab,再往下就是實際的命令了,比如gcc -c test.c -o test.o。

    變量

    makefile的書寫非常像shell腳本,可以在文件中定義"變量名 = 變量值"的形式,之后需要使用這個變量時只需要寫一個$符號加上變量名即可,當然,和shell一樣,最好用()包裹起語句來。

    調試

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:C語言入門參考,帶你初識C語言
    下一篇:重溫C語言之C語言概述知識

    C語言創建windows窗口實例

    C++回調函數是什么?

    C++ shared_ptr和動態數組

    C語言有哪些關鍵詞,C語言44個關鍵詞大全

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美三级片,白洁外传,第四色播日韩AV第一页,啪啪免费观看大全av 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>