学习笔记11-C语言-指针
生活随笔
收集整理的這篇文章主要介紹了
学习笔记11-C语言-指针
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
什么是指針:
指針是一種特護的數(shù)據(jù)類型,使用它可以定義指針變量,指針變量存儲的是整型數(shù)據(jù),代表內(nèi)存的編號,通過這個編號可以訪問到對應(yīng)內(nèi)存。為什么使用指針
1、函數(shù)與函數(shù)之間是相互獨立的,但是有些時候需要共享變量傳參是單向值傳遞全局變量容易命名沖突使用數(shù)組還需要傳遞長度函數(shù)的命名空間是相互獨立的,但是地址空間是同一個,所以指針可以解決這個問題 2、由于函數(shù)傳參是值傳遞(內(nèi)存拷貝),對于字節(jié)數(shù)較多的變量,值傳遞的效率較低,如果傳遞的是變量的地址,只需要傳遞4|8字節(jié),根據(jù)32|64位決定 3、堆內(nèi)存無法取名,它不像stack、bss、data讓變量名與內(nèi)存建立聯(lián)系,只能使用指針來記錄堆內(nèi)存的地址編號從而使用該堆內(nèi)存。如何使用指針:
定義: 類型* 變量名_p; int* p;1、由于指針變量與普通變量的用法上有很大的區(qū)別,為了以示區(qū)分,建議在變量名后面加上_p2、指針的類型表示該指針變量存儲的是什么類型變量的地址,指針的類型決定了可以通過指針變量訪問的字節(jié)數(shù)3、一個*只能定義一個指針變量int a1,a2,a3;int* p1,p2,p3;//p1指針,p2,p3是intint *p1,*p2,*p3;//p1,p2,p3都是指針變量4、指針變量與普通變量一樣的是隨機的默認(rèn)值,一般初始化為NULL(空值)。賦值(引用):變量名_p = 地址;//地址必須是有權(quán)限而且有意義的內(nèi)存地址指向棧內(nèi)存:int num;int* p = NULL;p = #指向堆內(nèi)存:int* p = NULL;p = malloc(4);解引用: *p通過指針變量中記錄的內(nèi)存編號來訪問對應(yīng)的內(nèi)存,該過程可能產(chǎn)生段錯誤。但是原因是因為存儲了非法的內(nèi)存編號注意:訪問的字節(jié)數(shù)是由指針變量的類型決定的。*p=1000;練習(xí)1:實現(xiàn)一個變量交換函數(shù),調(diào)用它對一個數(shù)組進行排序
#include<stdio.h>void swap(int* p1,int* p2) {int change=0;change=*p1;*p1=*p2;*p2=change; }int main(int argc,const char* argv[]) {int num[10]={8,0,5,6,9,3,2,7,4,1};for(int i=0;i<9;i++){for(int j=i+1;j<10;j++){if(num[i]<=num[j])swap(&num[i],&num[j]);}}for(int i=0;i<10;i++){printf("%d",num[i]);}}練習(xí)2:實現(xiàn)一個函數(shù),計算兩個整數(shù)的最大公約數(shù)、最小公倍數(shù),最大公約數(shù)用return返回,最小公倍數(shù)使用指針返回
注意:想要獲取多個返回值,可以借助指針返回
使用指針需要注意的問題:
空指針:值是NULL的指針變量都是空指針,如果對空指針進行解引用產(chǎn)生段錯誤。一般NULL也是一種錯誤標(biāo)志,如果一個函數(shù)返回值是指針類型時,當(dāng)函數(shù)執(zhí)行出錯可以返回NULL表示該函數(shù)執(zhí)行出錯。注意:NULL在絕大多數(shù)的系統(tǒng)中都是0,在個別系統(tǒng)上是1if(NULL==p)if(!p)如何避免空指針帶來的段錯誤:使用來歷不明的指針之前先做判斷是不是空指針。1、當(dāng)函數(shù)的參數(shù)是指針時,別人傳給你的就有可能使空指針2、從函數(shù)獲取返回值使,也可能獲取到的使空指針野指針:指針指向不確定的內(nèi)存的指針野指針解引用的危害:1、臟數(shù)據(jù)2、段錯誤3、一切正常野指針的危害比空指針更嚴(yán)重,因為野指針無法判斷出來,而且可能是隱藏性的錯誤,短時間內(nèi)不暴露所有的野指針都是人為制造的,如和避免產(chǎn)生野指針:1、定義指針是一定要初始化2、函數(shù)不返回局部變量地址3、指針指向的內(nèi)存被釋放后,指針變量立即置空=NULL指針的運算:
指針變量里存儲的是整型,理論上整型數(shù)據(jù)能使用的運算符她都能用,但絕大多數(shù)都是無意義的。指針+n:指針+指針類型的寬度*n(int就是 4) 前進了n個元素 指針-n:指針-指針類型的寬度*n 后退了n個元素 指針-指針:(指針-指針)/指針類型寬度 計算相隔了多少個這種元素指針與const:
const int* p; 當(dāng)我們?yōu)榱颂岣邆鲄⑿识褂弥羔槙r,傳參的效率雖然提高了,但是變量也有被修改的風(fēng)險,這種寫法就可以保護指針變量指向的內(nèi)存不被修改int const *p; 效果同上 int* const p; 保護指針變量不被修改const int* const p; 保護指針變量和指針變量指向的內(nèi)存不被修改 int const * const p; 效果同上const保護誰按照就近原則指針數(shù)組與數(shù)組指針:
指針數(shù)組:由指針組成的數(shù)組,它的成員都是指針變量類型* arr[長度];數(shù)組指針:專門指向數(shù)組的指針類型 (*arr)[長度];指針與數(shù)組名:
數(shù)組名是一種特殊的指針,它是常量,不能改變它的值,它與數(shù)組內(nèi)存是映射關(guān)系,沒有自己的內(nèi)存空間 數(shù)組名 == &數(shù)組名 == &數(shù)組名[0]指針變量它由自己的存儲空間,如果它存儲的是數(shù)組的首地址,指針可以當(dāng)作數(shù)組使用數(shù)組名[i] == *(數(shù)組名+i)*(指針名+i) == 指針名[i]注意:數(shù)組作為函數(shù)的參數(shù)時蛻變成了指針,所以長度丟失了。二級指針:
二級指針就是指向指針的指針。里面存儲是指針變量的地址。 定義:類型** 變量名_pp; 賦值:變量名_pp = 地址;變量名_pp = &指針變量; 解引用:*變量名_pp <=> 指針變量 p**變量名_pp <=> *指針變量 *p注意:當(dāng)函數(shù)之間需要共享指針變量是必須傳遞二級指針函數(shù)指針:
函數(shù)返回值 (*函數(shù)指針名p)(參數(shù)列表);函數(shù)名就是一個地址(整數(shù)),它代表了函數(shù)在代碼段中的位置可以通過函數(shù)指針,把函數(shù)作為參數(shù)傳遞給另一個函數(shù),這叫回調(diào)函數(shù)指針就是指向函數(shù)的指針,里面存儲的就是該函數(shù)在代碼段中的位置。總結(jié)
以上是生活随笔為你收集整理的学习笔记11-C语言-指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fragment已经被added了导致的
- 下一篇: 服务发布方法(蓝绿,灰度,金丝雀)