指標學習2

2021-07-13 13:43:14 字數 2271 閱讀 1607

1、指向指標的指標(二級指標):指向一級指標(值一定是一級指標的位址);

例:int num = 10;

int *p = # //一級指標:值是變數的位址

int **pf = &p; //二級指標:值是一級指標的位址

int ***q = &pf; //**指標:值是二級指標的位址

printf(「*p = %d, **pf = %d, ***q = %d」,,*p,**pf,***q);

解幾級指標,就咬用到幾個*;

2、指標變數占用的記憶體大小:在32位系統上,指標變數都是占用4位元組,在64位系 統上都是占用8位元組(即指標占用記憶體大小不分型別,不分級別)

3、指標和陣列:

1)陣列空間是連續的,儲存相同型別的值;

2)陣列名是陣列首元素位址,即指向陣列首元素的指標;

3)陣列名是指標常量,值不能改變,只能指向陣列首元素(陣列值可變)

4、如何使用指標訪問陣列:

1)陣列名做加減操作(避免陣列越界),加——後移,減——前移

2)int num = (&a[2]) - (&a[0]); //2 陣列指標做減法計算的是偏移量,指標變數則是計算相差的位址

3)array[1] = *(array + 1) ; //取array[1]位址然後解引

array + 1 = &array[1];

**5、指標陣列:陣列中所有元素都是指標,本質上是陣列;

例:int p[5]; // 陣列中儲存的都是 int ; p實際上是二級指標

6、陣列指標:指標指向乙個陣列,本質上是指標 int (p);*

7、指標作為引數傳遞:傳位址(雙向傳遞)

8、括號運算子:

int c; c = (5,6); //有括號取後面的值

// 函式void dele(char *s)的功能是刪除字串s中 的所有數字字元和非字母字元,並將字串壓縮。 例如原字串為:abc12ef5ghij8#%%yz,處理後的 字串為:abcefghijyz。

*#include 

*#include**

void dele(char *ch);

int main(int argc, const

char * argv )

void dele(char *ch)

else

}printf("壓縮後的字串為%s\n",ch);

1、記憶體分配方式:

1)靜態記憶體分配:編譯時由系統完成的,預先分配

2)動態記憶體分配:執行時完成的,分配與釋放空間(何時,大小)都由程式設計師決定,即時分配

2、5大記憶體區

棧:編譯器自動分配釋放,需預先知道分配記憶體的大小,如區域性變數,形參

堆:使用malloc和new動態分配的空間,執行時由程式設計師手動分配大小和釋放空間

例:float pt = (float )malloc(4); //手動分配空間

if(pt == null)

*pt = 100.0;

… free(pt); //使用完手動釋放空間

pt = null; //釋放的是堆空間,pt變成了野指標,所以要置空

注意: void *malloc(size_t size) //malloc和free必須成對出現,若malloc次數多於free:記憶體洩漏,否則會導致二次刪除,破壞記憶體

size_t:實際上是unsign long型別

size:指開闢空間的大小,單位:byte

malloc開闢的空間沒有名稱,開闢成功返回乙個指標,指向開闢空間,若失敗則返回null,因此在使用malloc時需要判斷是否分配成功

常量區:存放常量,不允許修改值,如常量字串,由編譯器完成開闢和釋放

全域性/靜態儲存區:儲存全域性變數(由編譯器開闢記憶體,程式結束後釋放)和靜態變數

**區:存放函式體的二進位制**

**3、常量指標與指標常量:主要出現在字串中

常量指標(字串)(const char *pt/ char const *pt):指標指向的變數值是乙個常量,指向的位址可變,但指標指向變數的值不可變(const在*前面)pt = &a; pt = &a1;

指標常量(陣列)(char * const pt):指標指向變數的值是可變,但指標指向的位址不可變(*在const前面)pt = 6; *pt = 10;*

指標學習2

主要是指標陣列 陣列指標 函式指標的學習,以及二重指標 二維陣列的學習。1 一般規律 int p p是乙個指標 int p 5 p是乙個陣列 2 定義符號時,首先要搞清楚定義的符號是誰 第一步 找核心 接著看誰跟核心結合 第二步 找結合 然後繼續向外擴充套件。3 分析 1 程式為什麼要分層?2 總結...

C 學習筆記 指標2

關於指標形參的注意事項 不要企圖通過改變指標形參的值而使指標實參的值改變,看下面的 include void swap int p1,int p2 int main int a 5,b 9 int pa,pb pa a pb b if a b swap pa,pb std cout a b 要想輸入...

《C和指標》學習筆記2

在c中,在幾乎所有使用陣列名的表示式中,陣列名的值是乙個指標常量,也就是陣列裡第乙個元素的位址。它的型別取決於陣列元素的型別。只有在兩種情況下,陣列名並不用指標常量來表示,就是當陣列名作為sizeof操作符或者單目操作符 的操作時。sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。取乙個陣...