1. 程式人生 > >c 復習

c 復習

c

  • 什麽是指針?舉例說明指針數組和數組指針的區別。
    指針: 定義(類型名變量名), 用於保存地址, 地址保存的值類型和指針相同
    數組指針: 指向數組的指針 類型 (
    變量名)[長度] = 類型 變量名[XX][列(長度)]
    指針數組: 保存指針的數組 基本類型* 變量名[長度]

  • 字符串指針和字符串數組有什麽區別,請詳細說明。
    char *p = "12345678"; // p是指針,p可以改變, sizeof(p):4 , "12345678"在常量數據區
    char p[] = "12345678"; // p是數組,p本身不可以改變 sizeof(p):9 賦值完成後"12345678"放在棧區

  • 可以對指針進行哪些操作,分別會產生怎樣的效果。
    p+整數: p + sizeof(指向的類型) 整數 0x00 + 1 = 0x00 + sizeof(int)1 = 0x04
    p-整數: p - sizeof(指向的類型) 整數 0x04 - 1 = 0x04 - sizeof(int)1 = 0x00
    p-指針: 兩個元素差了多少個元素
    ++/--: 和 +整數 -整數一樣

  • 什麽是數組,說明數組的基本特征。
    數組就是用於連續存儲相同類型數據的一種結構

  • 從內存角度解釋數組在函數傳參過程中發生了哪些變化。
    當將一個數組作為參數傳入函數的時候,會進行退化
    退化為指向數組首元素地址的指針,所以說,這個指針的大小是4

    數組的大小不會改變,它的大小就是sizeof(類型)*長度

  • 數組和指針是怎樣進行相互轉化的,它們之間有什麽區別?
    char n[10], pn = n(&n[0]); // char
    n[0] ==
    (pn+0) == pn[0]
    char n[10][10], (pn)[10] = n(&n[0]); // char[10]
    n[1][2] ==
    (*(pn+1)+2) == pn[1][2]

  • 使用一個函數一般分為幾個步驟,分別是什麽?
    聲明函數 -> 定義函數 -> 調用函數

  • 默認形參是什麽,如何為一個函數添加默認形參
    默認形參用於被經常使用但又有少數情況需要其他值的情況。
    默認形參可以在函數聲明或函數定義的時候添加

    使用規則:必須從右往左定義,中間不能有間隔

  • 在C++中引用和指針有什麽異同,如何定義他們。
    定義指針(*),定義引用使用(&)
    異: 語法規則上引用沒有地址,引用不能引用引用,引用必須初始化,引用只能引用一個變量
    同: 都可以在函數中修改形參

  • 在C++中函數的傳參方式有幾種,分別是什麽?
    傳地址、傳引用、傳值

  • 面向對象的基本特性是什麽,分別體現在哪裏?
    封裝:訪問屬性
    繼承: 繼承
    多態: 虛函數、函數重載、模板

  • 在不同權限的繼承中,基類成員的訪問權限在子類中會產生哪些變化?
    public private protected
    public public 不被繼承 protected
    private private 不被繼承 private
    protected protected 不被繼承 protected

  • 例舉出常用的字符串操作函數以及它的作用<string.h>。
    strlen() - 獲取字符串長度
    strcpy() - 拷貝字符串
    strcmp() - 比較字符串
    strcat() - 拼接字符串
    strtok() - 字符串切割

  • 怎樣定義和使用一個虛函數,析構函數為什麽最好被定義為虛函數。
    在成員函數前加virtual關鍵字。
    避免產生內存泄漏。

  • 當類中存在虛函數時,它會產生哪些變化。
    它的首地址位置會多出一個虛表指針,指向的是一個保存當前類所有虛函數的虛表
    內存角度上,類對象的大小多了指針的長度

  • 什麽情況下會使用到虛繼承,使用的格式是什麽
    用於消除菱形繼承產生的二義性。
    class A{ public: int n;}
    class B: public A{ }
    class C: public A{ }
    class D : public virtual B, virtual public C { }

  • 函數重載是什麽,進行重載時有哪些要求。
    函數重載可用於實現多態,它可以使相同的函數接收不同的參數
    要求: 參數個數、參數類型不同,只有返回值不同的不可以重載

  • 重寫、重載和覆蓋分別是什麽,請詳細說明。
    重寫(作用域不同): 虛函數, 完全相同
    重定義(作用於不同):子類函數名和父類相同
    重載(作用域相同):函數名相同,函數特征不同

  • 運算符重載有幾種形式,一般使用哪種形式,有哪些運算符不能被重載。
    友元重載(<< >>)\推薦使用成員重載
    . ,: :: -> sizeof

  • 怎樣使用模板,模板特化與模板偏特化分別是什麽,函數為什麽沒有偏特化?
    template<class/typename T, ...>
    模板特化: 針對於特殊類型特化所有的T類型
    模板偏特化: 針對於特殊類型特化部分的T類型
    函數的偏特化其實就是函數重載

  • new\malloc 和 delete\free有什麽區別。
    new\delete 會調用構造和析構
    new\delete 是運算符
    new 會返回指定類型的對象,malloc是void*

  • 使用宏有哪些需要註意的地方,怎樣避免出現這樣的情況。
    宏沒有類型檢測,宏沒只是簡單的替換,要註意優先級

  • 怎樣定義一個靜態數據成員,如何使用這個成員。
    使用static在類中聲明,在類外初始化。
    public: 類名::變量 對象.變量

  • 怎樣定義一個靜態成員函數,使用這個函數需要註意什麽。
    在成員函數前加上static。 只能訪問類內的靜態成員

  • 在C++中結構體和類有什麽區別,舉例說明。
    C++中除了默認訪問權限,其它都一樣
    struct(public) class(private)

  • ++i(--i)和i++(i--)有什麽區別,舉例說明.
    ++i: 先++再使用 i++先使用再++

  • 運算優先級最低的元算符是什麽,最高的是什麽,obj->num++的執行順序是什麽
    , . -> ++

  • 怎樣獲取和設置一個函數執行後的錯誤碼,一般在什麽時候獲取它。
    獲取: GetLastError(), 監視窗口輸入err,hr,在函數執行完畢之後
    SetLastError()

  • 什麽是內核對象,他有哪些特性,例舉你知道的內核對象。
    內核對象是操作系統維護的一組數據結構,它是跨進程的,它擁有一個引用計數,
    當打開一個內核對象的時候,引用計數+1,關閉時-1,當計數為0就銷毀。
    進程、線程、互斥體、郵槽、IOCP、事件、信號量、線程池

  • 什麽是內核句柄,怎樣獲取或關閉一個內核句柄。
    句柄是一個整型索引,用於在句柄表中查找對應的內核對象
    CreateProcess\CreateFile\CloseHandle()......

  • 列出幾個常用到的線程操作函數
    CreateThread()/_beingthreadex()/TerminateThread()/_endthreadex/SuspendThread()/ResumeThread()

  • 列出幾個常用到的進程操作函數
    CreateProcess()/ WinExec()/ system()/ TerminateProcess()/SuspendProcess()/ResumeProcess()

  • 說明臨界區和互斥體有哪些區別
    臨界區不是內核對象,臨界區有線程擁有者,臨界區崩了會死鎖
    互斥體是內核對象,有線程擁有著,崩了不會死鎖

  • 列出常用內核對象的創建函數
    CreateThread()/CreateProcess()/CreateMutex()/CreateEvent()

  • 說明動態鏈接庫和靜態鏈接庫的區別。
    後綴名: .lib .dll
    使用: lib需要包含頭文件,使用#pragma comment(lib, "")
    dll LoadLibrary() + GetProcAddress()
    程序: 動態鏈接庫不會增加程序的大小,但是不方便程序的移植
    靜態鏈接庫會增加程序的大小,但是可以跨平臺

  • 舉例說明常用的導出函數的方法。
    使用.def模塊定義文件導出 // 默認就沒有名稱粉碎
    使用_declspec(dllexprot) // extern "C" 用於防止名稱粉碎機制

  • 說明信號量是什麽,如何使用信號量。
    信號量可以被多次加鎖,沒有指定最大信號量
    加鎖-1: WaitForXXXObject()
    解鎖+1: ReleaseSemaphore()

  • 舉例說明你說知道的進程間通信的方式。
    郵槽、套接字、WM_COPYDATA、管道

  • IOCP是什麽,怎樣創建和綁定設備道完成端口。
    IOCP全稱IO完成端口,
    創建: HANDLE h = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 線程數)
    綁定: CreateIoCompletionPort(h, 設備句柄, 0, 0)

  • 使用udp通信,服務器和客戶端的基本步驟是什麽。
    服務器: WSAStartup() -> socket() -> bind() -> sendto()/recvfrom() -> closesocket() ->WSACleanup()
    客戶端: WSAStartup() -> socket() -> bind() -> sendto()/recvfrom() -> closesocket() ->WSACleanup()

  • 使用tcp通信,服務器和客戶端的基本步驟是什麽。
    服務器: WSAStartup() -> socket() -> bind() -> listen() -> accept() -> send()/recv() -> closesocket() ->WSACleanup()
    客戶端: WSAStartup() -> socket() -> connect() -> send()/recv() -> closesocket() ->WSACleanup()
    inet_addr("") htonl()

  • 異步IO是什麽,怎樣使用異步IO讀寫設備?
    同一時刻做多件事情,FILE_FLAG_OVERLAPPED

  • WaitForSingleObject的作用是什麽,它的復數形式怎樣使用。
    等待一個內核對象,當它為有信號時(激發態)就返回,否則等待道設置的超時時間
    WaitForMultipleObjects(要等待的個數,數組,是否等待所有,超時)
    WaitForSingleObject和WaitForMultipleObjects副作用: 等待信號量會把當前信號-1

  • 已學過的網絡通信模型有哪幾種?
    IOCP、消息選擇、事件選擇(64)

  • python的基本類型有幾種,分別是什麽
    int、float、復數

  • 分別說明怎樣定義字典、列表和元組,並說明它們的特點
    dict = { }; dict = dict() 保存鍵值對,可以修改 *
    list = [ ]; list = list() 保存一組相連的數據,可修改
    tuple = (1,); tuple = tuple() 不可修改

  • 字符串切片指的是什麽,詳細說明它的用法。
    a = "1234567"
    a[:] = "1234567"
    a[:-1] = "123456"
    a[::-1] = "7654321"
    a[::2] = "1357"

  • 例舉常用的python列表操作函數。
    list l
    l.append
    l.insert
    l.pop(index)

  • 什麽是對稱密碼,什麽是非對稱密碼,分別例舉。
    對稱密碼使用的密鑰相同 AES DES 3DES
    非對稱密碼使用的密鑰不同 RSA RC4

  • 什麽是凱撒密碼,什麽是維吉尼亞密碼,什麽是base64編碼。
    凱撒密碼:一種簡單的替換密碼
    維吉尼亞密碼: 一種稍微復雜的替換密碼
    base64: 使用指定的64個字符替換需要編碼的字符串

  • RSA加密算法的本質是使用了哪一個數學難題?
    求大質數

  • 怎樣創建、查看、使用和刪除數據庫?
    create database XXX;
    show databases;
    drop database XXX;
    use XXX;

  • 怎樣創建、查看、重命名和刪除一張表。
    create table XXX(列名 類型 約束, ...);
    show tables;
    desc table XXX;
    rename table x to xx;
    drop table XXX;

  • 怎樣添加、刪除和修改表的指定字段
    alter table XXX add 列名 類型 約束;
    alter table XXX change old new;
    alter table XXX modify XXX 類型;
    alter table XXX drop XXX 類型;

  • 怎樣添加、刪除和修改數據。
    insert into XXX(x1,x2) values(v1,v2);
    delete from XXX
    update XXX set x1 = v1, x2 = v2;

  • 表的約束有哪些,分別說明怎樣使用這些約束
    主鍵: primary key;
    非空: not null;
    唯一: unique;
    默認: DEFAULT
    外鍵: ALTER table XXX add constraint foreign key(外間名) references XXX(xx)

  • 怎樣獲取表"CharInfo"中的所有數據? 怎樣獲取表"NetChat"中列"user"的所有數據?
    select * from CharInfo;
    select user from NetChat;

  • 怎樣獲取表"ChatFriend"中列"name"為"1"開頭或"1"結尾的數據?
    select * from ChatFriend where name like "%1" or name like "1%"

  • 怎樣獲取表"ChatFriend"中列"name"為"1"或列"friend"為"1"的數據?
    select * from ChatFriend where name = 1 or friend = 1;

  • 三大窗口風格是什麽,分別對應哪幾個宏。
    子窗口(WS_CHILD) 彈出窗口(WS_POPUP) 重疊窗口(WS_OVERLAPPED)

  • UpdateData()的作用是什麽,他又哪幾種用法,分別是什麽。
    UpdateData() 用於控件和對象的數據交換
    UpdateData(true) 從控件上獲取數據
    UpdateData(false) 設置數據道控件上

  • MFC和SDK的關系是什麽,它的基類名稱為什麽。
    MFC是SDK的C++封裝, CObject

  • 對話框分為哪兩種,在SDK和MFC中分別怎樣創建?
    模態對話框:
    SDK: DialogBox() MFC:doModal()
    非模態對話框:
    SDK: CreateDialog() MFC:create()

  • 想要改變當前窗口的顯示方式可以使用哪個函數,怎樣使用這個函數?
    ShowWindow(): SW_SHOW\SW_HIDE\SW_MINIMIZ\SW_MAXIMIZE

  • 使用SDK顯示一個窗口,基本框架是什麽?
    創建窗口類->註冊窗口類->創建窗口->顯示窗口->更新窗口->消息循環
    WNDCLASS->RegisterClass()->CreateWindow()->ShowWindow()->UpdateWindow()
    ->(GetMessage()->TranslateMessage()->DispathMessage())

  • 什麽是隊列消息?什麽是非隊列消息,怎樣產生這兩個消息?
    隊列消息: 在消息循環中處理的的消息 PostMessage() 不阻塞
    非隊列消息: 直接在回掉函數中處理的消息 SendMessage() 阻塞

  • 修改窗口的回調函數有幾種方式,最好使用哪種?
    SetWindowLong()\SetClassLong() 推薦使用SetWindowLong()

  • MFC實現消息映射的原理是什麽?依賴於哪兩個宏?
    使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 維護了一個數組,保存了所有需要相應的消息和對應的函數

  • 在編寫MFC程序時,用戶代碼的入口是哪個函數?
    CMyApp.InitInstance() 虛函數

  • 消息分為幾種,分別是什麽,用於哪些環境下?
    窗口消息 WM_...... 直接被窗口響應
    控制消息 WM_COMMAND 由簡單控件轉發給窗口
    通知消息 WM_NOTIFY 由通用控件轉發給窗口

  • 二叉樹的前中後序變量
    根左右 左根右 左右根

  • 逆序輸出鏈表中的數據
    void show(Node* node)
    {
    if (node != null)
    {
    show(node->next);
    printf("%d", node.i);
    }
    }

  • 鏈表和順序表的比較
    鏈表:空間可以是不連續的,不支持隨機存取,鏈表的插入和刪除時間復雜度為O(1)
    順序表:空間是連續的,隨機存取的時間復雜度為O(1)
  • c 復習