c 語言基礎總結

2021-08-26 12:13:49 字數 4066 閱讀 2867

1.strlen和sizeof區別?

因為sizeof值在編譯時確定,所以不能用來得到動態分配(執行時分配)儲存空間的大小。

sizeof (type)

sizeof expr

2.陣列和指標

使用陣列的時候編譯器會把他轉換為指標。

因此在一些情況下陣列的操作實際是指標的操作。使用陣列作為auto變數的初始值,推斷得到型別是指標。

int ia=;

auto ia2(ia); //ia2是int*指標

使用decltype不會發生如此的轉換。

陣列名和指標(這裡為指向陣列首元素的指標)區別?

3.結構體內存對齊問題?

結構體內成員按照宣告順序儲存,第乙個成員位址和整個結構體位址相同。

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

4.malloc和new的區別?

5.巨集定義和函式有何區別?

巨集定義和

const

區別?

巨集定義和

typedef

區別?

巨集定義和內聯函式

(inline)

區別?

6.條件編譯

#ifdef, #else, #endif

作用?

7.volatile

有什麼作用?

8.區別以下指標型別?

int *p[10]

int (*p)[10]

int *p(int)

int (*p)(int)

9.a和&a

有什麼區別?

假設陣列int a[10];int (*p)[10] = &a;
10.野指標是什麼?

11. static_cast、dynamic_cast、const_cast、reinterpret_cast

好的部落格參考

static_cast相當於傳統的c語言裡的強制轉換,該運算子把expression轉換為new_type型別,用來強迫隱式轉換,例如non-const物件轉為const物件,編譯時檢查,用於非多型的轉換,可以轉換指標及其他,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法:

①用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。

進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的;

進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的。

②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

③把空指標轉換成目標型別的空指標。

④把任何型別的表示式轉換成void型別。

注意:static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性。

type必須是乙個類型別,在第一種形式中,type必須是乙個有效的指標,在第二種形式中,type必須是乙個左值,在第三種形式中,type必須是乙個右值。在上面所有形式中,e的型別必須符合以下三個條件中的任何乙個:e的型別是是目標型別type的公有派生類、e的型別是目標type的共有基類或者e的型別就是目標type的的型別。如果一條dynamic_cast語句的轉換目標是指標型別並且失敗了,則結果為0。如果轉換目標是引用型別並且失敗了,則dynamic_cast運算子將丟擲乙個std::bad_cast異常(該異常定義在typeinfo標準庫標頭檔案中)。e也可以是乙個空指標,結果是所需型別的空指標。

dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換(cross cast)。

在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;

在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。dynamic_cast是唯一無法由舊式語法執行的動作,也是唯一可能耗費重大執行成本的轉型動作。

const_cast,用於修改型別的const或volatile屬性。 

該運算子用來修改型別的const(唯一有此能力的c++-style轉型操作符)或volatile屬性。除了const 或volatile修飾之外, new_type和expression的型別是一樣的。

①常量指標被轉化成非常量的指標,並且仍然指向原來的物件;

②常量引用被轉換成非常量的引用,並且仍然指向原來的物件;

③const_cast一般用於修改底指標。如const char *p形式。

new_type必須是乙個指標、引用、算術型別、函式指標或者成員指標。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)。

reinterpret_cast意圖執行低階轉型,實際動作(及結果)可能取決於編輯器,這也就表示它不可移植

12.c++多型性與虛函式表

基類指標在呼叫成員函式(虛函式)時,就會去查詢該物件的虛函式表。虛函式表的位址在每個物件的首位址。查詢該虛函式表中該函式的指標進行呼叫。

每個物件中儲存的只是乙個虛函式表的指標,c++內部為每乙個類維持乙個虛函式表,該類的物件的都指向這同乙個虛函式表。

虛函式表中為什麼就能準確查詢相應的函式指標呢?因為在類設計的時候,虛函式表直接從基類也繼承過來,如果覆蓋了其中的某個虛函式,那麼虛函式表的指標就會被替換,因此可以根據指標準確找到該呼叫哪個函式。

13.析構函式能丟擲異常嗎

不能。

c++標準指明析構函式不能、也不應該丟擲異常。c++異常處理模型最大的特點和優勢就是對c++中的物件導向提供了最強大的無縫支援。那麼如果物件在執行期間出現了異常,c++異常處理模型有責任清除那些由於出現異常所導致的已經失效了的物件(也即物件超出了它原來的作用域),並釋放物件原來所分配的資源, 這就是呼叫這些物件的析構函式來完成釋放資源的任務,所以從這個意義上說,析構函式已經變成了異常處理的一部分。

(1) 如果析構函式丟擲異常,則異常點之後的程式不會執行,如果析構函式在異常點之後執行了某些必要的動作比如釋放某些資源,則這些動作不會執行,會造成諸如資源洩漏的問題。

(2) 通常異常發生時,c++的機制會呼叫已經構造物件的析構函式來釋放資源,此時若析構函式本身也丟擲異常,則前乙個異常尚未處理,又有新的異常,會造成程式崩潰的問題。

14.智慧型指標是怎麼實現的?什麼時候改變引用計數?

15.手寫strcpy,手寫memcpy函式,手寫strcmp函式

#include#include/*

char* strcpy(char* dst, const char* src)

} else

} return ret;}*/

void* memcpy(void* dst, const void* src, size_t n)

else

return ret;

}char* strcat(char* dst,const char* src)

int strcmp(const char* str1,const char* str2)

return *str1-*str2;

}int main()

C語言基礎總結

常用的資料型別 基於32位作業系統 void 宣告函式無返回值或無引數 空型別 1 char 字元型型別資料 1 int 整型資料 4 float 單精度浮點型資料 4 double 雙精度浮點型資料 8 short 短整型資料 2 long 長整型資料 4 long long 長長整型資料 8 l...

C語言基礎總結

本文為c語言基礎知識的總結,並非教程,適合有基礎的猿們進行複習之用。1 static 靜態 變數有什麼作用?static全域性變數和普通全域性變數相比的區別在於static全域性變數只初始化一次,這樣做的目的是為了防止在其他檔案單元中被引用 static區域性變數和普通區域性變數的區別是static...

C語言基礎總結1

c語言基礎資料型別 int 4位元組 記憶體 short 2位元組 記憶體 char 1位元組 記憶體 float 4位元組 記憶體 定義變數 int a 5 int b 3 int c a b 表示式是由,變數,常量,運算子組成的有結果的式子。如 上面的 c a b c語言中的輸入和輸出 scan...