C语言复习:指针知识
指針知識體系搭建
指針強化
指針是一種數(shù)據(jù)類型
測試指針變量占有內(nèi)存空間大小:sizeof(指針名);
2)*p操作內(nèi)存
在指針聲明時,*號表示所聲明的變量為指針
在指針使用時,*號表示操作指針所指向的內(nèi)存空間中的值
????*p相當于通過地址(p變量的值)找到一塊內(nèi)存;然后操作內(nèi)存
????*p放在等號的左邊賦值(給內(nèi)存賦值)
????*p放在等號的右邊取值(從內(nèi)存獲取值)
3)指針變量和它指向的內(nèi)存塊是兩個不同的概念
//含義1 給p賦值p=0x1111; 只會改變指針變量值,不會改變所指的內(nèi)容;p = p +1; //p++;但是指向的內(nèi)容發(fā)生變化。不再是原來的那塊內(nèi)存了。
//含義2 給*p賦值*p='a'; 不會改變指針變量的值,只會改變所指的內(nèi)存塊的值
//含義3 =左邊*p 表示 給內(nèi)存賦值, =右邊*p 表示取值 含義不同。切記!
//含義4 =左邊char *p
//含義5 保證所指的內(nèi)存塊能修改
4)指針是一種數(shù)據(jù)類型,是指它指向的內(nèi)存空間的數(shù)據(jù)類型
含義1:指針步長(p++),根據(jù)所致內(nèi)存空間的數(shù)據(jù)類型來確定
p++= → (unsigned char )p+sizeof(a);
結(jié)論:指針的步長,根據(jù)所指內(nèi)存空間類型來定。
????
注意:????建立指針指向誰,就把把誰的地址賦值給指針。圖和代碼和二為一。????
????????不斷的給指針變量賦值,就是不斷的改變指針變量(和所指向內(nèi)存空間沒有任何關系)。
間接賦值(*p)是指針存在的最大意義
1)指針變量和它指向的內(nèi)存塊變量是兩回事。
2)要在大腦中形成一種條件反射:指針指向某個變量,就是把某個變量地址賦給指針
3)*p間接賦值成立條件:3個條件
a)2個變量(通常一個實參,一個形參)
b) 建立關系,實參取地址賦給形參指針
c) *p形參去間接修改實參的值
Int iNum = 0; //實參 int *p = NULL; p = &iNum; iNum = 1; *p =2 ; //通過*形參 == 間接地改變實參的值 *p成立的三個條件 |
4)引申: 函數(shù)調(diào)用時,用n級指針(形參)改變n-1級指針(實參)的值。
//改變0級指針(int iNum = 1)的值有2種方式
//改變1級指針(eg char *p = 0x1111 )的值,有2種方式
//改變2級指針的(eg char **pp1 = 0x1111 )的值,有2種方式
均是直接修改(賦值)和間接修改(上級指針修改)
//函數(shù)調(diào)用時,形參傳給實參,用實參取地址,傳給形參,在被調(diào)用函數(shù)里面用*p,來改變實參,把運算結(jié)果傳出來。
//指針作為函數(shù)參數(shù)的精髓。
指針和內(nèi)存四區(qū)相結(jié)合
指針做函數(shù)參數(shù)
?
編號 | 指針函數(shù)參數(shù) 內(nèi)存分配方式(級別+堆棧) | 主調(diào)函數(shù) 實參 | 被調(diào)函數(shù) 形參 | 備注 | ||||
01 | 1級指針 (做輸入) | 堆 | 分配 | 使用 | 一般應用禁用 | |||
棧 | 分配 | 使用 | 常用 | |||||
Int showbuf(char *p); int showArray(int *array, int iNum) | ||||||||
02 | 1級指針 (做輸出) | 棧 | 使用 | 結(jié)果傳出 | 常用 | |||
int geLen(char *pFileName, int *pfileLen); | ||||||||
03 | 2級指針 (做輸入) | 堆 | 分配 | 使用 | 一般應用禁用 | |||
棧 | 分配 | 使用 | 常用 | |||||
int main(int arc ,char *arg[]); 指針數(shù)組 int shouMatrix(int [3][4], int iLine);二維字符串數(shù)組 | ||||||||
04 | 2級指針 (做輸出) | 堆 | 使用 | 分配 | 常用,但不建議用,轉(zhuǎn)化成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); | ||||||||
?
指針做函數(shù)參數(shù),問題的實質(zhì)不是指針,而是看內(nèi)存塊,內(nèi)存塊是1維、2維。
一級指針典型用法(指針做函數(shù)參數(shù))
一級指針做輸入
int showbuf(char *p)
int showArray(int *array, int iNum)
一級指針做輸出
int geLen(char *pFileName, int *pfileLen);
理解
主調(diào)函數(shù)還是被調(diào)用函數(shù)分配內(nèi)存
被調(diào)用函數(shù)是在heap/stack上分配內(nèi)存
二級指針典型用法(指針做函數(shù)參數(shù))
二級指針做輸入
int main(int arc ,char *arg[]); 字符串數(shù)組
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); //避免野指針
理解
主調(diào)函數(shù)還是被調(diào)用函數(shù)分配內(nèi)存
被調(diào)用函數(shù)是在heap/stack上分配內(nèi)存
三級指針輸出典型用法
三級指針做輸出
int getFileAllLine(char ***content, int *pLine);
int getFileAllLine_Free(char ***content, int *pLine);
理解
主調(diào)函數(shù)還是被調(diào)用函數(shù)分配內(nèi)存
被調(diào)用函數(shù)是在heap/stack上分配內(nèi)存
雜項,指針用法幾點擴充
1)野指針 2種free形式
int getData(char **data, int *dataLen);
int getData_Free(void *data);
int getData_Free2(void **data);
2)2次調(diào)用
主調(diào)函數(shù)第一次調(diào)用被調(diào)用函數(shù)求長度;根據(jù)長度,分配內(nèi)存,調(diào)用被調(diào)用函數(shù)。
3)返回值char */int/char **
4)C程序書寫結(jié)構(gòu)
商業(yè)軟件,每一個出錯的地方都要有日志,日志級別
一般應用禁用malloc/new
轉(zhuǎn)載于:https://www.cnblogs.com/love-DanDan/p/8917906.html
總結(jié)
以上是生活随笔為你收集整理的C语言复习:指针知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言复习:内存模型2
- 下一篇: Python3.5+selenium操作