這篇文章給大家分享的是有關(guān)c語(yǔ)言指針有什么用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。
10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有萬寧免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。c語(yǔ)言指針用法:1、指針變量與普通變量一樣默認(rèn)值不確定,一般初始化為NULL;2、指針變量的用法與普通變量不同,一般以p結(jié)尾加以區(qū)分;3、指針變量的類型決定了通過指針變量訪問內(nèi)存時(shí)訪問幾個(gè)字節(jié)。
c語(yǔ)言指針用法:
一,指針定義:
指針變量的取值范圍取值0~4G,是一種數(shù)據(jù)類型(無符號(hào)整數(shù),代表了內(nèi)存編號(hào))。它可以用來定義變量(與int、long一樣),與int、long不同的它存儲(chǔ)整數(shù)代表了內(nèi)存的編號(hào),通過這個(gè)變量可以訪問對(duì)應(yīng)編號(hào)的內(nèi)存。
二,指針的作用
1、堆內(nèi)存無法取名字(無法使用標(biāo)識(shí)符與堆內(nèi)存建立聯(lián)系),必須配合指針。
2、函數(shù)之間的參數(shù)是值傳遞(內(nèi)存拷貝),使用指針可以優(yōu)化參數(shù)的傳遞效率(需要對(duì)變量進(jìn)行保護(hù))。因?yàn)镃語(yǔ)言采用的是值傳遞(內(nèi)存拷貝),會(huì)隨著變量字節(jié)數(shù)的增加而降低運(yùn)行效率而傳遞變量的地址永遠(yuǎn)只拷貝4或8字節(jié)。
void func(const int* p);
但使用指針變量的值可能會(huì)被修改,可以配合const。
3、函數(shù)之間是相互獨(dú)立的,有時(shí)協(xié)同配合需要共享變量(全局變量過多會(huì)造成命名沖突,不會(huì)被釋放浪費(fèi)內(nèi)存),函數(shù)之間傳遞變量的地址可以達(dá)到共享變量的效果。
三,指針的用法:
定義:類型* 變量名_p;
1、指針變量與普通變量一樣默認(rèn)值不確定,一般初始化為NULL。
2、指針變量的用法與普通變量不同,一般以p結(jié)尾加以區(qū)分。
3、指針變量的類型決定了通過指針變量訪問內(nèi)存時(shí)訪問幾個(gè)字節(jié)。
4、指針變量不能連續(xù)定義(一個(gè)*只能定義出一個(gè)指針變量):
int* p1,p2;
// p是指針,p2是int類型變量
int *p1,*p2;
// p1和p2都是指針變量
賦值:指針變量 = 內(nèi)存編號(hào)。 變量名_p = 地址;
內(nèi)存編號(hào)要能夠訪問,如果編號(hào)錯(cuò)誤可能會(huì)造成段錯(cuò)誤。void*可以與任意類型指針進(jìn)行自動(dòng)轉(zhuǎn)換(C++中不行)。要保障地址與物理內(nèi)存有對(duì)應(yīng)關(guān)系(映射過),否則有段錯(cuò)誤。
int* p = malloc(4); int* p = # // 引用內(nèi)存
訪問:*指針變量 //解引用----訪問指針變量
根據(jù)指針變量中存儲(chǔ)的內(nèi)存編號(hào)去訪問對(duì)應(yīng)的內(nèi)存。如果之前賦值的內(nèi)存編號(hào)有誤,這個(gè)步驟會(huì)出現(xiàn)段錯(cuò)誤。訪問的字節(jié)由指針類型決定。 int* p = # *p <=> num;
5,指針運(yùn)算
指針變量中存儲(chǔ)的就是整數(shù),因此為整型數(shù)據(jù)能使用的運(yùn)算符指針變量基本都能使用
,但不是所有運(yùn)算都有意義。
指針+整數(shù) = 指針+寬度*整數(shù)
指針-整數(shù) = 指針-寬度*整數(shù) // 指針進(jìn)行前后移動(dòng)
指針-指針 = (指針-指針)/寬度 // 兩個(gè)指針之間相隔多少個(gè)元素
指針 >、<、<=、>= 指針 可以判斷兩個(gè)誰(shuí)在前誰(shuí)在后。
6,數(shù)組與指針
.數(shù)組名就是個(gè)特殊的地址,也能當(dāng)指針使用,數(shù)組名是個(gè)常量(數(shù)組名與數(shù)組第一個(gè)元素的首地址是對(duì)應(yīng)關(guān)系,普通指針是指向關(guān)系)。數(shù)組名可以使用指針的解引用,而指針變量也可以使用數(shù)組的[];arr[i] <=> *(arr+i)。數(shù)組當(dāng)函數(shù)的參數(shù)就脫變成了指針變量,長(zhǎng)度丟失,安全性也變小void func(int * const arr,size_t len);
7,指針的高級(jí)使用
數(shù)組指針與指針數(shù)組:
(1).數(shù)組指針(指針):專門用來指向數(shù)組的指針。
int arr[10]; int (*p)[10] = arr; int* p = #
void func(int I,int J,int(*arr)[J])
//二維數(shù)組 函數(shù)傳參使用數(shù)組指針
(2).指針數(shù)組(數(shù)組):一個(gè)數(shù)組里存儲(chǔ)的數(shù)據(jù)類型是指針。
把無序的離散數(shù)據(jù),歸納到一起。
int* arr[3]; <=> int *p1,*p2,*p3;
(3).二級(jí)值針: 指向指針的指針
4.函數(shù)指針: 指向函數(shù)的指針(不能解引用)
9,const 指針
const int * p;
// 不能通過解引用去修改指針?biāo)赶虻膬?nèi)存的數(shù)據(jù)
(1)保護(hù)函數(shù)的參數(shù)
(2)當(dāng)指針指向的是只讀數(shù)據(jù),也應(yīng)該加上const防止出現(xiàn)段錯(cuò)誤。
int const * p;
// 同上
int* const p;
// 不能修改指針變量的值
可以防止指針變量意外變成野指針
const int* const p;
// 既保存指針?biāo)羔樀膬?nèi)存,也保護(hù)指針變量
int const * const p;
// 同上
運(yùn)行:
*p_num=10 請(qǐng)輸入一個(gè)數(shù)字:1 *p_num是1 *ptr=10
10,注意事項(xiàng):
空指針:
變量指針的值等于NULL,這種指針叫空指針。
不能對(duì)空指針解引用,一定會(huì)出現(xiàn)段錯(cuò)誤。
當(dāng)操作重啟時(shí)會(huì)跳轉(zhuǎn)NULL地址,進(jìn)行重啟,因此NULL存儲(chǔ)操作系統(tǒng)用于重啟的數(shù)據(jù)。
NULL在C語(yǔ)言中是一種錯(cuò)誤標(biāo)志,如果函數(shù)的返回值是指針類型,
結(jié)果一旦NULL表示函數(shù)執(zhí)行出錯(cuò)或失敗。
如何避免空指針造成的段錯(cuò)誤?
使用來歷不明(函數(shù)的參數(shù))的指針前先進(jìn)行檢查,if(NULL == p)。
野指針:
指針變量的值不確定,使用野指針不一定會(huì)出錯(cuò)。
int* p; // 野指針
使用野指針的后果:段錯(cuò)誤。
注意:野指針是無法分辨的,所以比空指針危害更。
如何避免野指針造成的錯(cuò)誤?
所有的野指針都人制造出來的,只要人人都不制造野指針就會(huì)有野指針造成的錯(cuò)誤。
定義指針變量時(shí)一定要初始化。
指針變量所指向的內(nèi)存初始釋放后要及時(shí)賦值為空(堆內(nèi)存)。不返回局部變量的地址。
感謝各位的閱讀!關(guān)于c語(yǔ)言指針有什么用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!