目錄
隆回網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。指針
一、什么叫做指針?
二、指針的類型
1.一級(jí)指針
2.二級(jí)指針
? 3.數(shù)組指針
4.函數(shù)指針
? 5.野指針
三、指針的運(yùn)算
? 1.指針的賦值
? 2.指針的移動(dòng)
3.指針-指針
指針是用來(lái)存放內(nèi)存地址的變量,可以簡(jiǎn)單的理解為,指針就是地址,平時(shí)所說(shuō)的指針通常都是說(shuō)的指針變量。
? 舉個(gè)例子,定義一個(gè)整形變量并初始化:
int a = 20;
int *p = &a;
此時(shí)我們就說(shuō)指針變量p指向了a內(nèi)存的地址,如果通過(guò)解引用(*)操作,則會(huì)得出這塊內(nèi)存中存儲(chǔ)的值為20,這里要注意區(qū)分內(nèi)存地址和內(nèi)存儲(chǔ)存了什么是兩塊不同的空間,地址在32位機(jī)器上只占4個(gè)字節(jié),在64位機(jī)器上占8個(gè)字節(jié)。
? 和其他變量一樣,指針也可以進(jìn)行初始化,初始化如下:
int *p = NULL;
二、指針的類型?指針大致可以分為以下幾種類型:
1.一級(jí)指針? 一級(jí)指針就是我們常見(jiàn)的普通指針,例如上述的一個(gè)定義指針的例子,就是一個(gè)一級(jí)指針,除了int型的一級(jí)指針之外,還有其他常見(jiàn)的一級(jí)指針。
char ?*pc = NULL;
int ? *pi = NULL;
short *ps = NULL;
long ?*pl = NULL;
float *pf = NULL;
double *pd = NULL;
2.二級(jí)指針? 二級(jí)指針指的是指向一級(jí)指針的指針,里面存儲(chǔ)的是一級(jí)指針的地址,通過(guò)*解引用操作可以找到一級(jí)指針中存放的內(nèi)容,二次解引用**可以找到一級(jí)指針指向的地址的內(nèi)容,如下,便是一個(gè)二級(jí)指針,輸出為10
int a = 10;
int *p = &a;
int **pa = &p;
printf("%d",**pa);
? 3.數(shù)組指針? 數(shù)組指針,就是指向數(shù)組的指針,里面存放的是一維數(shù)組的地址其中一種形式如下:
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int(*p)[10] = arr;
? 我們就說(shuō)*p是一個(gè)數(shù)組指針,指向的數(shù)組擁有十個(gè)元素,每個(gè)元素類型是int類型,這里需要注意的是,如果寫成int *p[10] = arr(去掉括號(hào)),則會(huì)變成一個(gè)指針數(shù)組而不是數(shù)組指針,因?yàn)閇 ]的優(yōu)先級(jí)高于*,所以p先和右邊的[ ]相結(jié)合了
4.函數(shù)指針? 該指針指向的是一個(gè)函數(shù)的地址,如下便是一個(gè)函數(shù)指針為:
void (*p)();
? 5.野指針? 概念:野指針是指指針指向的內(nèi)存地址是未知的(隨機(jī)、不正確、沒(méi)有明確限制的都算未知)
? 既然知道了什么是野指針,那么有哪些操作容易產(chǎn)生野指針呢?
? 1.對(duì)指針定義時(shí)未進(jìn)行初始化,指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的缺省值是隨機(jī)的,它所指的空間是隨機(jī)的。
int main()
{
int * p;
*p = 10;
return 0;
}
? 2.指針越界訪問(wèn):指針指向的范圍超出了合理范圍,或者調(diào)用函數(shù)時(shí)返回指向棧內(nèi)存的指針或引用,因?yàn)闂?nèi)存在函數(shù)結(jié)束時(shí)會(huì)被釋放。
int main()
{
int arr[10] = {0};
int *p = arr;
for(int i = 0; i<= 11; i++)
{
*(P++) = i;//當(dāng)i=11時(shí),指針指向的范圍超出數(shù)組arr的范圍,p變成野指針。
}
return 0;
}
? 3.指針釋放后未置空:有時(shí)指針在free或delete后未賦值 NULL,便會(huì)使人以為是合法的。其實(shí)它們只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒(méi)有把指針本身忘記。此時(shí)指針指向的就是無(wú)效內(nèi)存。
int main()
{
int *p = NULL;
p = malloc(10 * sizeof(int));//malloc函數(shù)為開(kāi)辟內(nèi)存
if (!p)
{
return;
}
free(p);//釋放了內(nèi)存,故要馬上給p賦值為空指針NULL
p = NULL;
return 0;
}
所以要避免成為野指針,就應(yīng)當(dāng)盡量多的避免上述三種操作
三、指針的運(yùn)算 ? ? ? ? 1.指針的賦值指針的賦值通常有如下形式:
指針變量=&變量
指針變量=指針變量
指針變量=NULL
? 指針的移動(dòng)通常為指針±整數(shù),在下面的例子中,每一次循環(huán),指針p將跳到下一個(gè)地址,因?yàn)檫@里是int類型的數(shù)組,所以將跳過(guò)四個(gè)字節(jié)(關(guān)于指針移動(dòng)到底跳過(guò)多少個(gè)字節(jié),筆者會(huì)在之后再做總結(jié),這里不在敘述)
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
for (int i = 0; i< 10; i++)
{
p = p + 1;
printf("%p\n", p);
}
return 0;
}
3.指針-指針? 得到的是指針之間的元素個(gè)數(shù)
最后,這是筆者的第一篇博客,水平有限,如有解析不到之處請(qǐng)各位多多批評(píng)指正
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧