在了解指針之前,我們需要對(duì)內(nèi)存有一個(gè)了解。
?內(nèi)存概念:電腦上的存儲(chǔ)設(shè)備,程序運(yùn)行的時(shí)候會(huì)加載到內(nèi)存中,并使用
如何使用:
正如生活中,我們會(huì)把高樓大廈分成一層層、一個(gè)個(gè)小房間,以便實(shí)現(xiàn)查找。而計(jì)算機(jī)也將內(nèi)存分為了一個(gè)個(gè)小房間,并給每一個(gè)房間分配了地址編號(hào),我們可以通過(guò)這個(gè)編號(hào)去找到每一個(gè)內(nèi)存單元,而這意義其實(shí)就等同于地址
之前在【內(nèi)存】模塊,以及介紹了指針的概念,即編號(hào)=地址=指針
那么如何產(chǎn)生地址/編號(hào)?
計(jì)算機(jī)有32/64根地址線(xiàn),下面我們以32位計(jì)算機(jī)為例,64位同理
32位計(jì)算機(jī),假設(shè)有32位地址線(xiàn),每根地址線(xiàn)在尋址的時(shí)候會(huì)產(chǎn)生高電平和低電平,就是1或者0。
那么32根地址線(xiàn)產(chǎn)生的地址就是從00000000000000000000000000000000~11111111111111111111111111111111一共2^32次方個(gè)地址,這些地址就是一個(gè)個(gè)編號(hào)/指針
每一個(gè)指針對(duì)應(yīng)的內(nèi)存單元多大------一個(gè)字節(jié),記住就好
每一個(gè)地址標(biāo)識(shí)一個(gè)字節(jié),那我們就可以給2^32(Byte)/1024(KB)/1024(MB)/1024(GB)---->4GB的空間進(jìn)行編址
指針變量是什么
我們可以通過(guò)&,取出變量的內(nèi)存起始地址(取出的是第一個(gè)字節(jié)的地址),把地址存放到一個(gè)變量中,這個(gè)變量就是指針變量
在尋址的時(shí)候會(huì)產(chǎn)生地址,在32位的機(jī)器上,地址是32個(gè)0或者1組成2進(jìn)制序列,那地址就得用4個(gè)字節(jié)的空間來(lái)存儲(chǔ),所以一個(gè)指針變量的大小就應(yīng)該是4個(gè)字節(jié);在64位機(jī)器上,如果有64根地址線(xiàn),那一個(gè)指針變量的大小是8個(gè)字節(jié),才能存放一個(gè)地址
int main()
{int a = 10; //在內(nèi)存開(kāi)辟一塊空間,a占用4個(gè)字節(jié)空間
int* pa = &a; //把a(bǔ)的第一個(gè)字節(jié)的地址取出來(lái),放到pa中,pa就是指針變量
return 0;
}
?總結(jié)int a = 0;
int* pa = &a; int*類(lèi)型的指針,是為了存放int類(lèi)型變量的地址
*是指,pa是一個(gè)指針變量,用來(lái)存放a的地址
int是值,pa所存放地址的對(duì)象是int類(lèi)型的
😊指針數(shù)組
int* arr[5];
?意義指針類(lèi)型有許多種,如int*、char*……。那么不同的指針類(lèi)型究竟有什么意義呢?---------------提供了不同的視角去觀(guān)看和訪(fǎng)問(wèn)內(nèi)存
?二級(jí)指針(用來(lái)存放指針的指針)char* ????????一次訪(fǎng)問(wèn)(解引用)1個(gè)字節(jié),+1跳過(guò)1個(gè)字節(jié)
int* ????????一次訪(fǎng)問(wèn)(解引用)4個(gè)字節(jié),+1跳過(guò)4個(gè)字節(jié)
int a = 10;
int* pa = &a; //取出a的地址,放到pa上
int** ppa = &pa; //取出pa的地址,放到ppa上
int b = 20;
*ppa = &b; //等價(jià)于pa = &b;
**ppa = 30:
//等價(jià)于*pa = 30
//等價(jià)于a = 30
【int** ppa】:
第一個(gè)*是int *的一部分,表明ppa所存的地址的對(duì)象是int *類(lèi)型的
第二個(gè) *表明ppa是一個(gè)指針
我們存的是一個(gè)地址,而要通過(guò)一個(gè)地址去尋找(訪(fǎng)問(wèn))對(duì)應(yīng)的那個(gè)變量,就需要*(解引用)
#includeint main()
{int a = 10;
int* pa = &a;
printf("%p\n", &a);
printf("%p\n", pa);
*pa = 20;
printf("%d\n", *pa);
printf("%d\n", a);
return 0;
}
聯(lián)系之前的【意義】
?數(shù)組char* ????????一次訪(fǎng)問(wèn)(解引用)1個(gè)字節(jié),+1跳過(guò)1個(gè)字節(jié)
int* ????????一次訪(fǎng)問(wèn)(解引用)4個(gè)字節(jié),+1跳過(guò)4個(gè)字節(jié)
指針±整數(shù)
根據(jù)指針的類(lèi)型,看跳幾個(gè)字節(jié)
指針-指針
前提:兩個(gè)指針要指向同一塊空間,而且類(lèi)型也要相同
結(jié)果:指針-指針的絕對(duì)值,得到的是兩個(gè)指針之間的元素個(gè)數(shù)
int main()
{int arr[8] = {1,2,3,4,5,6,7,8 };
printf("%d", &arr[8] - &arr[0]);
return 0;
}
野指針,即那些危險(xiǎn)的指針,下面幾種錯(cuò)誤操作會(huì)產(chǎn)生野指針,需要注意
int main()
{int* pa;
*pa = 20; //局部變量指針未初始化,默認(rèn)為隨機(jī)值
return 0;
}
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
int* pa = arr;
int i = 0;
for (i = 0; i<= 11; i++)
{*(pa++) = i;
}
return 0;
}
int main()
{int* pa = NULL; //沒(méi)有有效的地址,就暫時(shí)先放一個(gè)空指針,相當(dāng)于把狗栓了起來(lái)
*(pa++); //雖然還是有潛在危險(xiǎn),但是只要你不去主動(dòng)招惹他就問(wèn)題不大
//總體還是比野指針要安全
return 0;
}
int* test(void)
{int a = 10;
return &a;
}
int main()
{int* pa = test();
printf("%d", *pa); //這個(gè)時(shí)候,這個(gè)地址已經(jīng)還給操作系統(tǒng)了
return 0;
}
如何規(guī)避野指針
你是否還在尋找穩(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)查看詳情吧
分享文章:初識(shí)C語(yǔ)言(指針)-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://muchs.cn/article12/doogdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容