目錄
創(chuàng)新互聯(lián)專注于河南企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),電子商務(wù)商城網(wǎng)站建設(shè)。河南網(wǎng)站建設(shè)公司,為河南等地區(qū)提供建站服務(wù)。全流程定制設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)前言:
1.指針的概念
2.指針的類型
3.野指針
3.1野指針的成因:
3.2如何避免野指針?
4.指針的運(yùn)算
5.指針和數(shù)組
6.二級(jí)指針
7.指針數(shù)組
總結(jié):?
對(duì)C語言來說,指針是一個(gè)難點(diǎn),如果用C語言來寫數(shù)據(jù)結(jié)構(gòu)的話,掌握指針的用法是必須的,如果指針沒學(xué)好,學(xué)數(shù)據(jù)結(jié)構(gòu)很吃力。所以希望大家一定要掌握指針?。。?!
1.指針的概念1.指針就是個(gè)變量,用來存放地址,地址唯一表示一塊內(nèi)存空間。
ps:(內(nèi)存編號(hào) = 地址 = 指針)
2.指針的大小是固定的4/8個(gè)字節(jié)(32位平臺(tái)/64位平臺(tái))
2.指針的類型指針是有類型的,指針的類型決定了指針+-整數(shù)的步長(zhǎng),指針解引用時(shí)候的權(quán)限。
下面我來解釋一下上面的紅色部分的意思,舉個(gè)例子,看一下下面的代碼及運(yùn)行結(jié)果:
#includeint main()
{
int a = 4;
int* p1 = &a;
char* p2 = &a;
printf("%p\n", p1);
printf("%p\n", p2);
printf("%p\n", p1+1);
printf("%p\n", p2+1);
return 0;
}
剛開始p1和p2地址是一樣的,但后面讓p1和p2分別進(jìn)行+1,后面的結(jié)果就不同了,p1加的1是int類型的1,而p2+1加的是char類型的1。
上面我們說到指針的大小是固定的4/8個(gè)字節(jié),假設(shè)是32位平臺(tái),那么一個(gè)指針就占4個(gè)字節(jié)。如果這時(shí)我定義一個(gè)整型指針和字符指針,那么這個(gè)整型指針在解引用時(shí)就可以訪問4個(gè)字節(jié),而字符指針就只能訪問1個(gè)字節(jié)。
3.野指針野指針的概念就是:指針的位置是不可知的
3.1野指針的成因:野指針的成因有兩個(gè):1.指針未被初始化? ?2.指針的越界訪問
給大家解釋一下:
指針未被初始化
這個(gè)應(yīng)該很好理解,就是我們?cè)趧?chuàng)建指針變量的時(shí)候沒有讓它指向任何對(duì)象
例如: int* p;? ?這樣p就是一個(gè)局部變量,p就是一個(gè)隨機(jī)值?
指針的越界訪問
看一下下面的代碼:
#includeint main()
{
int arr[5] = { 1,2,3,4,5 };
int* p = arr;
int i = 0;
for (i = 0; i< 6; i++)
{
printf("%d ", *p);
p++;
}
return 0;
}
先給大家解釋一下這個(gè)代碼的原理,int* p = arr; 這里arr是數(shù)組名,數(shù)組名是首元素的地址
那么現(xiàn)在p就是首元素的地址? 對(duì)p進(jìn)行解引用就是*p ,*p的值就是 1
p++;? 這行代碼就是讓p的地址++;指針的大小是固定的4/8個(gè)字節(jié), int型數(shù)據(jù)在C語言中也是4/8個(gè)字節(jié),我們拿到的指針都是數(shù)據(jù)第一個(gè)字節(jié)的地址,而數(shù)組在內(nèi)存中又是連續(xù)的,p++就是剛好往后移動(dòng)一個(gè)數(shù)據(jù)。
但是現(xiàn)在arr數(shù)組一共就只有5個(gè)元素,但是循環(huán)6次必然會(huì)導(dǎo)致數(shù)組的越界,那我們來看一下運(yùn)行結(jié)果
前面5個(gè)數(shù)就是arr數(shù)組里面的數(shù),第6個(gè)值就是一個(gè)隨機(jī)值。因?yàn)楫?dāng)循環(huán)到第6次時(shí),p已經(jīng)沒有指向的對(duì)象了,此時(shí)p就是一個(gè)野指針了。
3.2如何避免野指針?1.善于使用NULL,及時(shí)對(duì)指針進(jìn)行初始化
如果你在定義指針變量的時(shí)候,就已經(jīng)想到指針變量指向的對(duì)象,那就直接進(jìn)行初始化。
如果你在定義的時(shí)候,還不清楚指針指向的對(duì)象,也不清楚后面要不要使用指針,那就對(duì)指針變量賦值為NULL? ?
NULL就是空的意思,如果int *p=NULL; 那么此時(shí)p就是一個(gè)空指針,后面可以重新賦值,并不影響后面的使用。如果一個(gè)指針是空指針,在你還沒初始化前不要使用它。
2.避免指針的越界
3.避免返回局部變量的地址
4.指針的運(yùn)算看下面這段代碼:
#includeint main()
{
//指針地址加減整數(shù)
int arr[5] = { 1,2,3,4,5 };
int* p1 = arr;
int i = 0;
for (i = 0; i< 5; i++)
{
printf("%d ", *p1);
p1++;
}
printf("\n");
//解引用后的指針加減整數(shù)
int b = 10;
int* p2 = &b;
(*p2)++;
printf("%d", *p2);
return 0;
}
p1++是對(duì)地址進(jìn)行加減整數(shù),上面已經(jīng)介紹過了,現(xiàn)在就不過多介紹了
而(*p2)++, 我是定義了一個(gè)b變量,然后賦值給了10,然后把b的地址給了p2,*p2通過解引用得到的就是10,(*p)++? 相當(dāng)于 10++ ,得到的就是11.
看一下運(yùn)行結(jié)果:
ps:指針可以比較大小
指針還可以減指針
舉個(gè)例子:
#includeint main()
{
int arr[5] = { 1,2,3,4,5 };
printf("%d", &arr[4] - &arr[0]);
return 0;
}
這里沒用指針變量相減,其實(shí)是一樣的。畢竟指針就是地址。
兩個(gè)指針指向同一塊空間時(shí),指針減指針的絕對(duì)值得到的就是這兩個(gè)指針之間數(shù)據(jù)的個(gè)數(shù)。
注意這個(gè)不是 個(gè)數(shù)*數(shù)據(jù)類型的大小?C語言規(guī)定的
1.數(shù)組是可以通過指針來訪問的,可以參考我上面寫的代碼。
2.通常情況下 數(shù)組名是首元素的地址?
但凡事都有例外:
1.sizeof(數(shù)組名)? 得到的是整個(gè)數(shù)組的大小?
2.&+數(shù)組名 這里取出的是整個(gè)數(shù)組的地址。
3.在進(jìn)行函數(shù)傳參時(shí),如果形參是數(shù)組,可以把形參設(shè)計(jì)成指針,當(dāng)然如果形參是數(shù)組,也可以傳指針作為實(shí)參。
6.二級(jí)指針二級(jí)指針就是用來存放一級(jí)指針(指針變量)的地址。
#includeint main()
{
int a = 5;
int* pa = &a;
int** ppa = &pa;
return 0;
}
此時(shí)pa是一級(jí)指針,ppa就是二級(jí)指針,ppa是把pa的地址取出來放在ppa里面
**ppa就是*pa找到pa,在對(duì)pa進(jìn)行解引用找到a
7.指針數(shù)組指針數(shù)組的定義:int* 數(shù)組名[大小]??
指針數(shù)組的用法:
#includeint main()
{
int arr1[3] = { 1,2,3 };
int arr2[3] = { 4,5,6, };
int* arr3[2] = {arr1,arr2};
int i = 0;
int j = 0;
for (i = 0; i< 2; i++)
{
for (j = 0; j< 3; j++)
{
printf("%d ", *(arr3[i] + j));
}
printf("\n");
}
}
對(duì)指針數(shù)組可以模擬是實(shí)現(xiàn)二維數(shù)組,arr[i]里面存放的是arr1和arr2的地址。+j是獲得每一位數(shù)組元素的地址,在來*解引用拿到里面的值。輸出那個(gè)地方也可以換成??printf("%d ", arr3[i][j]);效果是一樣的。
指針真的很重要!指針真的很重要!指針真的很重要?。ㄖ匾氖虑檎f三遍)一定要掌握
希望這篇文章可以幫到你 (水平有限,如果有問題,歡迎大佬指正!感謝!)
你是否還在尋找穩(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)查看詳情吧
網(wǎng)站欄目:【C語言】全面解析指針,指針知識(shí)點(diǎn)整理-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://chinadenli.net/article4/dhgooe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、虛擬主機(jī)、搜索引擎優(yōu)化、電子商務(wù)、品牌網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容