C语言知识点总结:指针
一說到指針,大家可能都覺得,這才是C語言,但是關于指針,你又知道多少呢?
一、什么是指針?
先來說一說,什么是指針?
????????指針是一種特殊的數據類型,使用指針可以定義變量,這個變量就叫做指針變量
????????指針變量中存儲的是整型數據,代表了內存編號,通過這個編號可以訪問對應的內存'
二、為什么要使用指針
1、函數之間相互獨立,但有時是需要共享變量
????????????傳參是單向傳遞
????????????全局變量容易命名沖突
????????????使用數組還需要額外傳長度
????????????命名空間是獨立的,但是地址空間是同一個
以上幾點都是我們需要使用指針的情況
2、由于函數之間傳參是值傳遞(內存拷貝),對于字節數較多的變量,值傳遞效率較低,如果傳遞的是變量的地址,只需要傳遞4/8個字節,可以提高傳參效率
3、堆內存無法取名,他不像?data,bss,stack?內存段可以讓變量名與內存之間建立聯系,只能使用指針記錄堆內存得到地址,以此來使用堆內存
三、如何使用指針
先來看看指針的定義: ??????
????????????????定義:?類型*?變量名_p;
1、指針變量與普通變量是有很大區別的,建議在取名時以p結尾加以區分
2、指針類型表示存儲的是什么類型數據的地址,他決定了通過這個指針變量可以訪問的字節數
3、一個?*?只能定義一個指針變量???
int* p1,p2,p3; //此時只有p1是指針變量,p2,p3是int類型int *p1,*p2,*p3; //p1,p2,p3都是指針變量4、指針變量與普通變量一樣的是默認值是隨機的,一般都要初始化為 NULL?
????????????????賦值????變量名_p?=?地址;???//必須是有權限并有意義的地址
??????????????? 通過賦值指向棧內存:
????????????????????????????int*?p?=?#
??????????????? 通過賦值指向堆內存:
????????????????????????????int*?p?=?malloc(4);
???????????????? 解引用:????????*變量名_p;
???????????????? 通過指針變量中記錄的內存編號去訪問內存,該過程可能產生段錯誤,根源是由于賦值時存儲了一個非法的內存編號
????????????????????????????*p??<==>??num
?????????????????? 注意:解引用是訪問的字節數取決于定義指針變量時的類型
???
使用指針需要注意的問題
空指針:值為NULL的指針變量叫做空指針,如果進行解引用就會產生段錯誤
NULL?會作為錯誤標志的一種表示執行錯誤,當一個函數的返回值是指針類型時,函數如果執行出錯返回值就是?NULL?
????????????????
?如何避免空指針帶來的危害:
使用來歷不明的指針前先做判斷
1、從函數中獲取的指針返回值可能是空指針
2、當函數的參數時指針時,別人傳給你的就可能是空指針
????????????????????if(NULL?==?p)
????????????????????if(!p)
????????????'注意:NULL在絕大多數系統中是0,個別系統是1'
??????????? 野指針:指向不確定的內存空間
????????????解引用野指針的后果:
????????????????????????????1、一切正常
????????????????????????????2、臟數據
????????????????????????????3、段錯誤
??????? 野指針比空指針危害更嚴重,因為野指針無法被判斷出來,而且可能是隱藏性錯誤,短時間不暴露
??????? 所有的野指針都是程序員自己制造出來的,如何避免產生野指針:
???????????????? 1、定義指針變量時一定要初始化
???????????????? 2、函數中不要返回棧內存的地址
????????????????? 3、指針指向的內存釋放后,指針變量要及時置空(幾十賦空值)
指針的運算:
??????? 指針變量中存儲的是整型,理論上整型數據可以使用的運算符他都可以用,但是大多數都是無意義的
僅有三個有意義:
??????? 指針?+?n????????含義:指針?+?指針類型寬度的字節數*n?,相當于前進了n個元素
??????? 指針?-?n????????含義:指針?-?指針類型寬度的字節數*n?,相當于后退了n個元素
??????? 指針?-?指針?????含義:(指針?-?指針)/類型的字節數??,計算出兩個指針之間間隔了多少個指針元素
?????????????????? 注意:指針相減,指針類型必須一致
const?與指針:
????????????當我們為了提高傳參效率而使用指針時,傳參效率提高了,但是變量被共享后有了被修改的風險,可以借助?const?保護指針所指向的內存
????????????const?int*?p;???????????保護指針所指向的內存不被修改(*p不能改)
????????????int?const?*p;?????????? 保護指針所指向的內存不被修改(*p不能改)
????????????int*?const?p;??????????? 保護指針變量不能修改(p?不能改)
????????????const?int*?const?p;?????指針變量和指針所指向的內存都不能修改
????????????int?const*?const?p;?????指針變量和指針所指向的內存都不能修改
??????????? 就近原則:看?const?右邊最靠近的是?*?還是?p
指針數組與數組指針
指針數組:就是由指針變量組成的數組,他的成員是指針變量
?????????????????? int*?arr[10];
數組指針:專門指向數組的指針
??????????????????? 類型?(*arr)[長度]
??????????????????? int?(*arr)[10];
指針與數組名:
???????? 數組名可以看做一種特殊的指針,但是他是場量,不能修改他的值,數組名與數組的內存之間是映射關系,而指針變量與指針之間是指向關系,數組名是沒有自己的存儲空間的
?????????????????????? 數組名?==?&數組名?==?&數組名[0]
????????? 如果指針變量中存儲的是數組的首地址,指針可以當做數組使用,數組名也可以當做指針來使用
???????????????????????? 數組名[i]?==?*(數組名+i)
????????????????????????????????????????*(p+i)?==?p[i]?
???????????? 數組作為函數的參數時蛻變成了指針,所以長度丟失
?
二級指針
以上都是使用的以及指針,現在來說一說二級指針
二級指針就是指向指針的指針,里面存儲的是指針變量的地址
????????????????定義:?類型**?變量名_pp;
????????????????賦值:?變量名_pp?=?&指針變量
????????????????解引用:*變量名_pp??<=>??指針;
???????????????????????????**變量名_pp??<=>??*指針??<=>??普通變量
?
函數指針:
????????????????函數名就是該函數在代碼段中的內存首地址
????????????????調用函數其實就是跳轉到該函數所在的代碼段中去執行二進制指令
????????????????函數指針就是用來專門指向函數的指針,里面存儲的是函數的首地址,對函數指針解引用就可以執行函數
????????????????
????????????????函數指針可以當做函數使用
????????????????定義函數指針:
??????????????????????? 返回值?(*指針變量名)(類型1,類型2,...);
????????????????賦值:
????????????????????????指針變量名?=?函數名;
????????????????調用函數:
???????????????????????? 指針變量名(實參);
????????????????通過函數指針或者函數名,把函數當做參數一樣傳遞給另一個函數使用,這就是回調
?
函數遞歸
????????????????函數自己調用自己的行為叫做遞歸,可能導致出現死循環的效果
????????????????遞歸可以實現一種叫做分治的算法思想,把一個復雜的大問題分解成若干個相同的小問題,直到問題全部解決
????????????????1、設置出口
????????????????2、解決一個小問題
????????????????3、調用自己
????????????????遞歸函數每次調用自己都睡在棧內存中產生一份自己的拷貝,知道到達出口才一層層的釋放返回,因此遞歸相比于循壞來說非常耗費內存,與循環相比,遞歸非常慢能用循環解決的就不要使用遞歸
????????????????遞歸的優缺點:
????????????????????????????????????????缺點:耗費內存,速度慢
????????????????????????????????????????優點:易于理解,思路清晰,可以解決非線性問題的執行過程
總結
以上是生活随笔為你收集整理的C语言知识点总结:指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA 1262 Password
- 下一篇: 个人云笔记搭建