C 的學習筆記(第六章 指標和引用)

2021-08-14 02:44:39 字數 2849 閱讀 5570

引用動態記憶體

記憶體洩漏和懸掛指標

正文:初始化:可以有兩種初始化的方式:第一種在定義的時侯就直接初始化,比如:int ab=23;int *a=&ab(在這裡注意一下,必須直接打變數名,而不能打數值,因為字面型常量並不能直接的體現數值);第二種:先定義,後初始化:int *a; int b = 123; a = &b; cout << *a;差不多就是這麼乙個過程。(對了在這個過程中你需要體會以下幾個東西,指標的內容是乙個位址,所以你在初始化的時候,用的是指標本身的內容等於取位址這個變數名,而在初始化的時候,你直接可以去令*p等於這個內容,對了,多提一下,在第二回賦值的時候,你不能用指標指向這個變數名來賦值,這是乙個錯誤的語法,而且,null必須大寫。)

int a[12][2] = ;

cout << *(*(a+5)+5);

輸出的結果是16

應用:指標的使用也可以改變值的大小,訪問指標和訪問變數具有同樣的效果。

對於運算的改變,指標可以改變位置,即改變指標指向當前位置p的前方和後方第n個資料的位址(

給指標的賦值必須是同型別的,不存在自動轉化,可以是同型別變數的位址,同型別的指標。

指標的大小相等代表指向相同的位址,大小相減代表中間差幾個這個資料。

引用:引用的定義:應用是c++中新引入的概念,是c中不存在的資料型別。

引用的宣告:先定義,後宣告。(a:int  a;int &b=a;b:引用必須在宣告的同時完成初始化,而不能在宣告後,完成初始化。c引用不可以更改:)

引用的使用:  直接使用就好,它就是乙個別名。(需要注意的是,引用主要是用在函式的引數呼叫中,一般不在函式的主體中用這個東西)

動態記憶體(在堆區內生成,且只能通過指標來使用:a:需要大量的資料;b:需要儲存一組數,但是個數不確定)

c:這個不作介紹

c++:new與delete        int ×p=new int [10/乙個字母]/new int (10);        delete p;

記憶體洩漏和懸掛指標

記憶體洩漏:就是申請了乙個動態的記憶體,但是這個指向這個記憶體的指標被更改,進而造成這個記憶體無法被繼續使用。

懸掛指標:就是讓指標指向了乙個被釋放的空間,再釋放這個指標就會出現錯誤,因為不再存在可以被釋放的記憶體。

接下來,講我們的重點,指標與引用在使用過程中的方法:

引用與函式:形參寫為引用,而實參直接寫變數名。

指標既可以改地方也可以改值(指標改,本身改)

引用不能改位址,但是可以改值(引用改,本身改) 

指標函式與函式指標:如果乙個函式的返回值是乙個指標的話,我們稱這種函式叫做指標函式;(這裡有乙個一撮點,不能返回區域性變數的位置,因為它位於記憶體的棧區,會在自定義函式執行完之後被抹去,所以這時候,全域性變數或者堆區就很好了)

函式指標是用來將幾個相同型別的函式一次性的輸出 語法:int (*p)(int ,int )int  (int a,int b); p=ap1;

字串 a:字串可以用string庫來體現

b:也可以用字元陣列來體現 語法:char as=" ";               陣列的好處在於可以直接的輸入和輸出,但是,不可以直接更改或者賦值

c:也可以字元指標來體現                 char *p=" ";                 指標的好處在於可以直接的更改或者賦值,或者輸出但是,不可以去直接的輸入

字串的複製:語法:char*strcpy(char *s1,const char *s2)將s2複製進s1中

按字元數賦值:語法    char *strncpy(char *s1,const char*s2,int n)複製的字元數

字串的比較:語法    int strcmp(const char*s1,const char*s2)  <0 =0 >0

字串的連線:   語法     char*strcat(char*s1,const char*s2)

【在上述的函式中,我們可以看到,所有的原字串都用的是常指標,所以不必擔心原字串被修改】

陣列:a:指標與陣列:

一維陣列

陣列名訪問的方式:陣列名和指標名及其下標的偏移(值得注意的是,不可以用++來訪問陣列元素,因為陣列名是常熟代表的是首位址)

二維陣列

陣列名:二維的陣列名是指向一維陣列的,不是指向的二維陣列的元素。

訪問的方式:*(p*+1)+1 根據上面的內容我們很容易看出來這個語法的合理性

emmm特別寫一下,在二維陣列用指標搞定的時候,記得命名指標的時候寫的是char(型別名)(*p)[4](一維陣列的維度)。

指標與結構體:原因:因為結構體的資料很多時,我們需要來將結構體放在堆記憶體中。

語法:a:struct as=12;as *p=&12;

b:student *p=new as;(放在了堆記憶體中)

應用方法:p->a;

void型別的指標:void型別的指標可以指向各種資料的指標,可以被各種型別的指標賦值,但是,不能給其它的型別的指標賦值,因為不存在沒有型別的資料,他的出現,多半是為了起乙個中轉站的作用。

下面我們來介紹一下這個中轉站的流程:memcpy(void *dest,const void *scr ,size_t count )

例子:char *p=(char*)memcpy(a,b,10)

第二個用處是可以將char 型別的位址打出來,利用強制型別轉化,進而將char型的轉化為void型別的,進而打出他的位址。

//#include "stdafx.h"

#includeusing namespace std;

void swap(int *a, int *b)

int main()

瞎貼兩行**              

多說一句char與數字的運算就會導致數字變成ascall碼

C和指標 第六章 指標

1.指標在進行間接訪問之前,確保已被初始化。否則,會給指標分配乙個非法位址,輕則報錯,重則在毫不相干的地方報錯 指標偶爾包含合法位址 2.為了測試乙個指標變數是否為null,你可以將它與零值進行比較 3.注意 指標變數可以作為左值使用,並不是因為它們是指標,而是因為它們是變數。間接訪問指定了乙個特定...

第六章 指標

1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...

第六章 學習筆記

1.引數分為位置引數和關鍵字引數。def func positional para x,y,z passdef func keyword para kwd1 1,kwd2 4,kwd3 9 pass2.1 當有多個位置引數時,可以用乙個星號來收集引數,函式內使用這些位置引數時可以通過for 迴圈依次...