C 基礎知識(一)

2021-08-10 19:38:35 字數 3412 閱讀 6815

1.#inclue

#inclue中的 # 是預處理標誌,要最先處理,即在編譯器編譯**之前執行

#inclue<>   和 #include 「」 的區別:

< >引用的是編譯器的類庫路徑裡面的標頭檔案

" "引用的是你程式目錄的相對路徑中的標頭檔案

< >一般是引用自帶的一些標頭檔案:stdio.h、conio.h、string.h、stdlib.h等等之類的

" "一般是用來引用自己寫的一些標頭檔案

如果使用" ",會先在你專案的當前目錄查詢是否有對應標頭檔案

如果沒有,它還是會在對應的類庫路徑目錄裡面查詢對應的標頭檔案

2.iostream是乙個標準庫,裡面包含了cin和cout,用法就是std::cout<<"hello";

int x;

std:cin>>x;

還可以這樣:

int a,b,c;

std::cin>>a>>b>>c;

std::cout《是標頭檔案。//注意iostream.h

cout,cin,endl是在std命名空間中定義的物件。

4.c++中cout定義在命名空間std中,因此,在使用cout時可以用std::cout這樣的方式使用,需要注意的是,cout是ostream型別的物件,而ostream型別定義在iostream標頭檔案中,因此,在使用cout時,還需要使用#include. 總結:c++中的命名空間和c#中的意思基本一樣,也是相同的作用,用法也差不多,c++中的std是包含了所有的識別符號的命名空間,所以一般都要using std,當然也可以直接std::cout 這樣呼叫。

5.system("pause");是暫停的意思,在main函式最後可以不讓控制台關閉,用ctrl+f5也不會關閉,f5除錯的話又不加system("pause")的話就會自動關閉。

6.#include "stdafx.h" ???

7.#include和的區別:

#include中的iostream是c++標準標頭檔案庫,而#include是c中的標頭檔案庫,因為c++繼承了c的特性,所以也保留了iostream.h這種寫法,因為c++引入了namespace,所以用iostream的時候就要開闢命名空間,例如:

#include

using namespace std;

用iostream.h的時候就不用命名空間;

8.c++的編譯器是從上到下的,例如這段**

int _tmain()

void swap1(int& a, int& b)//按引用傳遞

void swap2(int *a, int *b)//按位址傳遞

int main()

21.c++為什麼要產生副本?通過彙編理解指標,學習彙編。。

22.棧區和堆區

1.棧區:由編譯器自動分配並且自動釋放,一般是函式引數和區域性變數

2.堆區:一般有程式設計師分配釋放,若不釋放,則程式結束時由系統釋放

堆是有一串不連續的鍊錶串聯起來的記憶體,速度較慢,容易產生記憶體碎片,容易使用,在申請記憶體的時候,系統會遍歷乙個空閒位址的鍊錶,找到合適的位址分配給使用者

棧是系統自動分配的,程式設計師不能操作,而且一般較小,一般是函式引數或者區域性變數,當函式結束時會釋放,棧中的記憶體是先進後出的。一般第乙個進棧的是函式下一行的記憶體位址,然後從右到左的函式引數,然後是變數,出棧時完全相反,所有變數出棧之後就剩函式下一行的記憶體位址了,然後自動跳轉到下一行執行!

23.記憶體的三種分配方式:

1. 從靜態儲存區分配:此時的內存在程式編譯的時候已經分配好,並且在程式的整個執行期間都存在。全域性變數,static變數等在此儲存。

2. 在棧區分配:相關**執行時建立,執行結束時被自動釋放。區域性變數在此儲存。棧記憶體分配運算內置於處理器的指令集中,效率高,但容量有限。

3. 在堆區分配:動態分配記憶體。用new/malloc時開闢,delete/free時釋放。生存期由使用者指定,靈活。但有記憶體洩露等問題。

24.類的初始化,用new和不用new的區別:

通過下面這個例子,會輸出「釋放1」,我們可以得出在不使用new建立物件時,物件的記憶體空間是在棧中的,其作用範圍只是在函式內部,函式執行完成後就會呼叫析構函式,刪除該物件。而使用new建立物件是建立在堆中的,必須要程式設計師手動的去管理該物件的記憶體空間

#includeclass testnew

;testnew::testnew(int id)

testnew::~testnew()

void test()

int main()

25.int *p=new int; 在堆中new乙個int型 即4位元組的記憶體空間,記憶體位址儲存在p中

*p=3,     修改這塊記憶體中存放的值,改為3

delete p;  釋放這塊記憶體空間,但是並沒有釋放p,p指標還能繼續使用,

p=0;      一般是將p清0,以免錯誤

p=new int;   p還能繼續使用

*p=400;       修改這塊記憶體中存放的值,改為400

26.記憶體洩漏:因為new在堆中的記憶體不會自動釋放,假如儲存這塊記憶體的指標是乙個函式中的區域性變數,當函式執行完畢後,會釋放這個指標,那麼這塊記憶體就象消失了一樣,再也找不回來了,這就叫記憶體洩漏,必須對這個指標使用delete

27.常見記憶體錯誤及對策

1. 記憶體分配未成功,卻被使用。

對策:使用記憶體之前檢查是否分配成功。用p!=null判斷。

2. 記憶體分配成功,未初始化就被使用。

記憶體的預設值沒有統一的標準。大部分編譯器以0作為初始值,但不完全是。

對策:記憶體初始化時賦初值。

3. 記憶體操作越界。

對策:只能是小心了。

4. 釋放了記憶體,仍然使用。

(1) 使用顯示delete和free的野指標。

對策:釋放完記憶體,將指標置為null。

(2) 使用隱式delete和free的野指標。主要是指函式返回指向棧記憶體的指標或引用。

對策:當然是不要返回就可以了。

5. 未釋放記憶體,導致記憶體洩露。

用new/malloc開闢了記憶體,沒用delete/free釋放.

對策:new和delete的個數一定相同;malloc和free的個數一定相同;new和delete一定對應

28.指標能加減能比較大小

29.將指標定義為常量指標 int *const p=&a;  p是乙個常量指標,p本身的值無法修改,但是它指向的位址可以修改

30.假如把const放在前面  const int *p=&a;   p是指向常量的指標,p本身可以修改,但是p所指向的目標不能修改

31.函式的成員變數的初始化

class a

{public:

a():x(4),y(7) //這是一種成員變數的初始化寫法,會輸出28

{cout《如果把x定義為const的話,就只能使用這種寫法給成員變數初始化,因為常量和引用只能被初始化不能被賦值。

C 基礎知識問答 一

1.靜態變數與非靜態變數的區別 靜態變數在類載入的時候進行初始化和分配記憶體,只有乙個例項。通過類來進行訪問。而非靜態變數是在物件在例項化的時候進行分配記憶體,有多個例項。通過物件來進行訪問。同乙個非靜態變數,多個例項中的值是不同。另外加一句,靜態函式成員不能訪問非靜態成員,如非靜態變數,非靜態函式...

C 基礎知識之一

c 基礎知識之一 1 型別 13種預定義簡單型別,2種預定義非簡單型別object string 6種使用者自定義型別class struct array enum delegate inte ce.13種預定義簡單型別細分為 非資料型別2種 bool char 數值型別11種 整數型別8種 sby...

c 基礎知識整理(一)

一 標頭檔案 1 define保護 為防止標頭檔案被多重包含,檔案的格式應該為 h 這樣寫是為了保證其唯一性 2 內聯函式 在編譯的時候,編譯器會將它自動展開 所以合理的使用內聯函式會提高效率 內聯函式一般都是短小的,但要除for,while這類的。有些函式即使不加了inline 也不一定會變成內聯...