日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言复习:指针知识

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言复习:指针知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

指針知識體系搭建

指針強化

指針是一種數據類型

  • 指針也是一種變量,占有內存空間,用來保存內存地址
  • 測試指針變量占有內存空間大小:sizeof(指針名);

    2)*p操作內存

    在指針聲明時,*號表示所聲明的變量為指針

    在指針使用時,*號表示操作指針所指向的內存空間中的值

    ????*p相當于通過地址(p變量的值)找到一塊內存;然后操作內存

    ????*p放在等號的左邊賦值(給內存賦值)

    ????*p放在等號的右邊取值(從內存獲取值)

    3)指針變量和它指向的內存塊是兩個不同的概念

    //含義1 給p賦值p=0x1111; 只會改變指針變量值,不會改變所指的內容;p = p +1; //p++;但是指向的內容發生變化。不再是原來的那塊內存了。

    //含義2 給*p賦值*p='a'; 不會改變指針變量的值,只會改變所指的內存塊的值

    //含義3 =左邊*p 表示 給內存賦值, =右邊*p 表示取值 含義不同。切記!

    //含義4 =左邊char *p

    //含義5 保證所指的內存塊能修改

    4)指針是一種數據類型,是指它指向的內存空間的數據類型

    含義1:指針步長(p++),根據所致內存空間的數據類型來確定

    p++= → (unsigned char )p+sizeof(a);

    結論:指針的步長,根據所指內存空間類型來定。

    ????

    注意:????建立指針指向誰,就把把誰的地址賦值給指針。圖和代碼和二為一。????

    ????????不斷的給指針變量賦值,就是不斷的改變指針變量(和所指向內存空間沒有任何關系)。

    間接賦值(*p)是指針存在的最大意義

    1)指針變量和它指向的內存塊變量是兩回事。

    2)要在大腦中形成一種條件反射:指針指向某個變量,就是把某個變量地址賦給指針

    3)*p間接賦值成立條件:3個條件

    a)2個變量(通常一個實參,一個形參)

    b) 建立關系,實參取地址賦給形參指針

    c) *p形參去間接修改實參的值

    Int iNum = 0; //實參

    int *p = NULL;

    p = &iNum;

    iNum = 1;

    *p =2 ; //通過*形參 == 間接地改變實參的值

    *p成立的三個條件

    4)引申: 函數調用時,用n級指針(形參)改變n-1級指針(實參)的值。

    //改變0級指針(int iNum = 1)的值有2種方式

    //改變1級指針(eg char *p = 0x1111 )的值,有2種方式

    //改變2級指針的(eg char **pp1 = 0x1111 )的值,有2種方式

    均是直接修改(賦值)和間接修改(上級指針修改)

    //函數調用時,形參傳給實參,用實參取地址,傳給形參,在被調用函數里面用*p,來改變實參,把運算結果傳出來。

    //指針作為函數參數的精髓。

    指針和內存四區相結合

  • 主調函數 被調函數
  • 主調函數可把堆區、棧區、全局數據內存地址傳給被調用函數
  • 被調用函數只能返回堆區、全局數據
  • 內存分配方式
  • 指針做函數參數,是有輸入和輸出特性的。
  • 指針做函數參數

    ?

    編號

    指針函數參數

    內存分配方式(級別+堆棧)

    主調函數

    實參

    被調函數

    形參

    備注

    01

    1級指針

    (做輸入)

    分配

    使用

    一般應用禁用

    分配

    使用

    常用

    Int showbuf(char *p);

    int showArray(int *array, int iNum)

    02

    1級指針

    (做輸出)

    使用

    結果傳出

    常用

    int geLen(char *pFileName, int *pfileLen);

    03

    2級指針

    (做輸入)

    分配

    使用

    一般應用禁用

    分配

    使用

    常用

    int main(int arc ,char *arg[]); 指針數組

    int shouMatrix(int [3][4], int iLine);二維字符串數組

    04

    2級指針

    (做輸出)

    使用

    分配

    常用,但不建議用,轉化成02

    int getData(char **data, int *dataLen);

    Int getData_Free(void *data);

    Int getData_Free(void **data); //避免野指針

    05

    3級指針

    (做輸出)

    使用

    分配

    不常用

    int getFileAllLine(char ***content, int *pLine);

    int getFileAllLine_Free(char ***content, int *pLine);

    ?

    指針做函數參數,問題的實質不是指針,而是看內存塊,內存塊是1維、2維。

  • 如果基礎類int變量,不需要用指針;
  • 若內存塊是1維、2維。
  • 一級指針典型用法(指針做函數參數)

    一級指針做輸入

    int showbuf(char *p)

    int showArray(int *array, int iNum)

    一級指針做輸出

    int geLen(char *pFileName, int *pfileLen);

    理解

    主調函數還是被調用函數分配內存

    被調用函數是在heap/stack上分配內存

    二級指針典型用法(指針做函數參數)

    二級指針做輸入

    int main(int arc ,char *arg[]); 字符串數組

    int shouMatrix(int [3][4], int iLine);

    二級指針做輸出

    int Demo64_GetTeacher(Teacher **ppTeacher);

    int Demo65_GetTeacher_Free(Teacher **ppTeacher);

    int getData(char **data, int *dataLen);

    Int getData_Free(void *data);

    Int getData_Free2(void **data); //避免野指針

    理解

    主調函數還是被調用函數分配內存

    被調用函數是在heap/stack上分配內存

    三級指針輸出典型用法

    三級指針做輸出

    int getFileAllLine(char ***content, int *pLine);

    int getFileAllLine_Free(char ***content, int *pLine);

    理解

    主調函數還是被調用函數分配內存

    被調用函數是在heap/stack上分配內存

    雜項,指針用法幾點擴充

    1)野指針 2種free形式

    int getData(char **data, int *dataLen);

    int getData_Free(void *data);

    int getData_Free2(void **data);

    2)2次調用

    主調函數第一次調用被調用函數求長度;根據長度,分配內存,調用被調用函數。

    3)返回值char */int/char **

    4)C程序書寫結構

    商業軟件,每一個出錯的地方都要有日志,日志級別

    一般應用禁用malloc/new

    轉載于:https://www.cnblogs.com/love-DanDan/p/8917906.html

    總結

    以上是生活随笔為你收集整理的C语言复习:指针知识的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。