C C 的一些亂七八糟的總結(一)

2021-09-08 08:00:23 字數 3794 閱讀 4820

0.最近在複習c++,好多東西都忘了 ==!!

從部落格中,書中看到的一些東西,在這裡簡單總結下,沒有章法,看到哪,複習到哪

1. 引用

c++中引用 具備了 指標的 所有功能

區別:(1) 引用在定義時必須初始化.引用和變數共享同一塊記憶體空間,而指標單獨有記憶體空間

(2) 指標進行刪除後,一般需要將其指向null,防止野指標,而引用至始而終都是它初始化時的位址,而且也不用刪除,它會在作用域範圍外由系統**

引用和它引用的變數指向的是同一塊記憶體空間

當修改其中任意乙個值時,兩個值都改變,當對引用重新賦乙個新值時,引用的值和原來引用指向的值都改變為這個新值,而引用位址不變

在c ++ 中還可以定義乙個類的物件的引用,與物件共享一塊記憶體

c++中 3  種傳遞函式引數的方式

(1)按值傳遞

(2)引用傳遞

(3)指標傳遞

3種方式的示例**如下:

#include using namespace std;

void f(int a)

void g(int * a)

void h(int &a)

int main()

可以看到按值傳遞,函式f()是不能修改a的

因為按值傳遞,只是把主函式a的值給了f函式的a值,這兩個a的位址不是同乙個位址,

在執行的過程中,會把主函式a的位址的資料拷貝給set函式a的位址

2 c++ 記憶體管理

記憶體分配方式

1. 從靜態區分配,一般是全域性變數和static型別變數

2.從棧區分配記憶體,一般是區域性的變數,會隨著所在函式的結束而自動釋放

3.從堆中分配,一般是使用手動分配,使用malloc()函式和new來申請任意大小空間,不過要手動釋放空間,相應的使用free()函式和delete釋放,

如果不釋放該空間,而且指向該空間的指標指向了別的空間.則該空間就無法釋放,造成記憶體洩露,造成了記憶體浪費

動態記憶體釋放問題與野指標

當我們使用free()和delete釋放一塊記憶體時,指標還是指向原來的位址,不過這時候的指標時野指標

1.指標銷毀了,並不表示所指的空間也得到了釋放 :記憶體洩露

2.記憶體被釋放了,並不表示指標也被銷毀了或指向null :野指標

示例**:

#include #include #include #include using namespace std;

int main()

free(p);

// 所謂的野指標

cout << "p:" << p << endl;

if(p != null)

p = null;

return 0;

}

指標的記憶體的傳遞

#include 

<

iostream

>

#include

<

stdlib.h

>

#include

<

string

.h>

using

namespace

std;

//返回記憶體位址方式,這是正確的 !

//因為是動態記憶體分配,在堆上分配的

char

*getmemory()

//常見錯誤是在棧上分配的被返回了,錯誤的

char

*getmemory2()

//通過指標的指標方式申請記憶體

void

getmemory3(

char

**p)

}int

main()

p2

=getmemory2();

if(p2)

getmemory3(

&p3);

if(p3)

return0;

}

3 動態陣列(從csdn還是cnblogs中看到的,直接在這貼吧,**找不到了)1維

#include #include int main()

stu1;

void print()

int print2()

#pragma pack (1) /*指定按1位元組對齊*/

typedef union stu

stu;

#pragma pack () /*取消指定對齊,恢復預設對齊*/

typedef union stu2

stu2;

int main()

對於結構體:

#include typedef struct stu1

stu1;

typedef struct stu2

stu2;

typedef struct stu3

stu3;

typedef struct stu4

stu4;

typedef struct stu5

stu5;

typedef union stu6

stu6;

typedef struct stu7

stu7;

typedef struct stu8

stu8;

int main()

size_t ,對於大小的比較,或者其他計算,會變成其補碼形式

#include using namespace std;

int main()

; return str;

}//棧裡面的變數都是臨時的。當前函式執行完成時,

//相關的臨時變數和引數都被清除了,所以返回的指標指向的已經是隨機的了

//但是str首位址被當成指標來處理,存放在堆中。

char* get_str2()

; return str;

}int main(int argc, char* ar**)

{ char* p = get_str();

cout << *p << endl;

cout << *(p+1) << endl;

cout << p << endl;

cout << "********************====" << endl;

char *p2 = get_str2();

//第1次執行 *p2的時候,由於p2指標的首位址被返回了,還是可以取到*p2的內容的

/*可以試試取*(p2+1),也是可以取到的

*/cout << *p2 << endl;

//第一次呼叫*p2的時候還是有資料的,但是第2次就沒有了,

//說明cout之後指標已經被破壞了

cout << *p2 << endl;

cout << *(p2+1) <

參考:整理自網際網路

C C 的一些亂七八糟的總結(二) 未完

1.模板 1 include iostream 23 using namespace std 4 函式模板 5template class t 6t cmin t m,t n 710 intmain 11 1 include iostream 23 using namespace std 45 模板...

一些亂七八糟的彙總

也不是很正式的一篇文章,就是有時做事的時候總會遇到一些奇奇怪怪的問題,或者有一些比較常用但是總是記不住或者懶得記的東西。標題是索引。應該會不斷加東西進去,就當字典用了唄,下次遇到就不用費勁找了。一般來說,無法解析的外部符號 後面就是一大串看不懂的鬼東西。這個是鏈結錯誤,一般來說在 上是不會有小紅線提...

一些亂七八糟的東西

1.zsh與bash的切換 切換bash chsh s bin bash 切換zsh chsh s bin zsh 2.檢視當前所使用的shell echo shell 3.初次安裝mysql,在設定中啟動後要新增環境 1 進入 usr local mysql bin,檢視此目錄下是否有mysql,...