C語言指針初階學習筆記-創(chuàng)新互聯(lián)

1.指針

定義:存儲其他變量地址的變量。(32位:4bit 64位:8bit)

成都創(chuàng)新互聯(lián)公司專注于宿遷企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城網(wǎng)站建設(shè)。宿遷網(wǎng)站建設(shè)公司,為宿遷等地區(qū)提供建站服務(wù)。全流程按需求定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)2.指針類型的意義

1.指針類型決定了指針解引用的權(quán)限有多大(即能夠訪問多長的字節(jié))。

int *pi=a;        //pi為整形指針,解引用訪問時可以訪問四個字節(jié)
char *pr=a;     //pr為字符型指針,解引用訪問時只能訪問一個字節(jié)

2.決定了走一步的距離。

int *pi=a;        //整形指針
char *pr=a;     //字符型指針
pi+1;       //假設(shè)pi存儲的地址為0x0012ff40,執(zhí)行+1操作后,pi指向0x0012ff44
pr+1;       //假設(shè)pr存儲的地址為0x0012ff40,執(zhí)行+1操作后,pi指向0x0012ff41
3. 野指針

定義:指針指向的位置是不可知的。(隨機的、不正確的、沒有明確限制的)

3.1 出現(xiàn)野指針的原因:

①指針未初始化

int *p;     //指針變量未初始化,默認為隨機值
*p=20;    //非法訪問內(nèi)存
int *p=NULL;   //指針進行了初始化

②指針越界訪問

int a[3]={1,2,3};
int *pa=a;
printf("%d",*(pa+2));    //訪問數(shù)組第3個元素
printf("%d",*(pa+3));    //數(shù)組的長度為3,在此處訪問數(shù)組的第“4”個元素,超出了數(shù)組的地址范圍,故為野指針

③指針指向的空間釋放
當你向內(nèi)存申請了一塊空間,并用指針指向了這塊空間。當這塊空間被釋放以后,指針并未及時釋放,依舊指向的是這塊空間。此時就是野指針。就像張三跟女朋友分手以后,張三每天給他的前女友電打話騷擾她,這并不合法。

int *ddd()
{int a=10;
	return &a;     
}
int main()
{int *p=ddd();    //函數(shù)返回a的地址,但a是函數(shù)內(nèi)的局部變量,當函數(shù)返回時,a的地址已經(jīng)被釋放了,但指針p依舊指向這個地址,所以這里p變成了野指針
	*p=10;
}
3.2 如何規(guī)避野指針

①指針要初始化

int *pi=NULL;
char *pc=NULL;

②小心指針越界
③指針指向空間釋放后及時置空

free(ptr);     //釋放指針指向的空間
ptr=NULL;    //指針置空

④指針使用之前檢查是否有效

if(p!=NULL)
	*p=10;
4. 指針運算 4.1 指針+整數(shù)
int a[3]={1,2,3};
int *pa=a;
for(int i=0;i<3;i++)
{printf("a[%d] = %d",i,*(pa+i));   //可用于實現(xiàn)遍歷數(shù)組
}
4.2 指針-指針

指針-指針:得到的是兩個指針之間的元素個數(shù)。(條件:這兩個指針必須指向同一塊空間)

int a[5] = {1,2,3,4,5 };
printf("%d\n", &a[4] - &a[0]);   //輸出值為4
return 0;
4.3指針的關(guān)系運算
int a[5] = {1,2,3,4,5 };
int *pa=a;
for(pa;pa<&a[5];pa++)
{printf("%d\n",*pa);
}

注:允許指向數(shù)組元素的指針與指向數(shù)組最后一個元素后面的那個內(nèi)存位置的指針比較,但是不允許與指向第一個元素之前的那個內(nèi)存位置的指針進行比較。

5. 指針和數(shù)組

數(shù)組名表示的數(shù)組首元素的地址。C語言在表示數(shù)組時借用了指針。定義arr[n]的意思是*(arr+n),到內(nèi)存arr的位置,然后移動n個單元,檢索存儲在那里的值。因此,當輸出數(shù)組第1位元素的值時可以演變出以下幾種方式。

int a[5] = {1,2,3,4,5 };
	int *p = a;
	printf("%d\n", a[1]);
	printf("%d\n", 1[a]);
	printf("%d\n", *(a + 1));
	printf("%d\n", *(p + 1));
	printf("%d\n", p[1]);
	printf("%d\n", 1[p]);
6. 二級指針

一級指針指向某個變量的地址。顧名思義,二級指針指向指向了某個變量地址的一級指針。如圖所示:

int a = 10;
	int *p = &a;
	int **pp = &p;
	printf("%d", **pp);    //二級指針的解引用
6.指針數(shù)組

指針數(shù)組是數(shù)組,就像好孩子是孩子一樣。在指針和數(shù)組中間加個“的”,即為指針的數(shù)組。顧名思義,就是存放指針的數(shù)組。

int a[5];   //整形數(shù)組
char b[5];   //字符型數(shù)組
int * p[5];   //指針數(shù)組

該筆記是學習了B站up主:鵬哥C語言 的課程所寫。課程傳送門

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站欄目:C語言指針初階學習筆記-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://muchs.cn/article10/dhipgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、Google、響應(yīng)式網(wǎng)站、移動網(wǎng)站建設(shè)網(wǎng)站策劃、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)