c++使用3
種不同解決方案儲存資料,區別是資料保留在記憶體中的時間
兩種儲存持續性為自動:自動變數和暫存器變數(
register
沒有記憶體位址)(堆疊)
在函式外定義的變數和使用關鍵字static定義的變數的儲存持續性都為靜態.分為
3 外部鏈結性,內部鏈結性和無鏈結性
所有靜態變數都有下面的兩個初始化特徵:
1.未被初始化的靜態變數的所有位數都被設定成0
2.只能使用常量表示式來初始化靜態變數
對於鏈結性為外部的變數,有且只有乙個檔案中包含了該變數的外部定義。其他檔案要引用該變數,必須在引用宣告中使用關鍵字extern
#include
//全域性變數
using
namespace
std;
intgloble = 10;
//定義
intab(
inta
,intb,
int*p)
儲存描述
持續性作用域
鏈結性如何宣告
自動自動
**塊無
在**塊中宣告(可使用關鍵字auto)
暫存器自動
**塊無
在**塊中使用關鍵字register
靜態,無鏈結性
靜態**塊
無在**塊中使用關鍵字static
靜態,外部鏈結性
靜態檔案
外部在函式外部
靜態,內部鏈結性
靜態檔案
內部在函式外部使用關鍵字static /*
*c++的訪問修飾符
*主要有:const--常數型,volatile--暫態型
*1.const--常數型
*const型變數在程式執行期間是不可以改變的,編譯程式可以隨意的將這些變數放到唯讀儲存器rom中
*const用途:可以阻止引數被修改,即當乙個指標傳送給乙個函式後,函式可能修改該指標所指向的變數,然而,如果指標在引數說明段
*用const修飾,函式就無法修改指標所指的內容了。
*通常,當乙個標準庫函式不必修改呼叫引數指引的物件時,引數則用const來修飾,
*2.volatile
*volatile通知編譯器:變數值可能由程式中沒有顯示說明的方式所改變。
*全域性變數的位址可能被傳遞到作業系統的時針子程式,用來儲存系統實時時間。
*引用修飾符volatile的原因:大多數c編譯程式都假定表示式內部的內容不變,並以這一假定來自動優化某些表示式。
*有些編譯程式都假定表示式內部的內容不變,並以這一假定來自動優化某些表示式。有些編譯程式在編譯時還有改變表示式的計算順序,volatile
*可以防止這些改變發生。
*const 和volatile可以一起使用,例如:如果假定0x80是僅由外部條件改變的埠的值,那麼下面說明既可以消除使用者希望防止的說有偶發***:
*const volatile unsigned char * port=0x80;*/
用new操作符分配的記憶體將一直存在,直到使用delete操作符將其釋放或程式終止
placement new操作符:
#include #include //1.引入new標頭檔案
const int buf = 512;
const int n = 5;
char buffer[buf];//2.
int main()
{ using namespace std;
double * pd1,* pd2;
cout<<"calling new and placement new:\n";
pd1 = new double[n];//
pd2 = new (buffer) double[n];//3.定義
for (int i =0 ;i
C 之記憶體管理
malloc calloc realloc 上述三種方式是使用者在堆上開闢空間的辦法,用完後必須用free釋放,否則會造成記憶體洩露。值得一提的是實際開闢的記憶體比申請的空間大 前面多申請32個位元組,後面多申請4個位元組。具體原因這裡就不再闡述,詳情見c語言動態分配記憶體 c語言記憶體管理方式在c...
C 之記憶體管理介紹
申請記憶體,使用運算子 new 釋放記憶體,使用運算子 delete 申請記憶體 int p new int 釋放記憶體 delete p.申請乙個塊記憶體 int arr new int 10 釋放塊記憶體 delete arr 判斷申請記憶體是否失敗 if null p 則說明記憶體分配失敗了,...
c基礎之記憶體管理
一 作用域 全域性變數和區域性變數 靜態全域性和區域性變數 總結 型別作用域 生命週期 區域性變數 int a 10 從變數定義到函式結束 區域性變數建立到函式結束 全域性變數 int a 10 整個專案檔案 程式建立到程式結束 static 區域性變數 int a 10 從變數定義到函式結束 程式...