【C語言】全面解析指針,指針知識點整理-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)專注于河南企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,電子商務(wù)商城網(wǎng)站建設(shè)。河南網(wǎng)站建設(shè)公司,為河南等地區(qū)提供建站服務(wù)。全流程定制設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

前言:

1.指針的概念

2.指針的類型

3.野指針

3.1野指針的成因:

3.2如何避免野指針?

4.指針的運算

5.指針和數(shù)組

6.二級指針

7.指針數(shù)組

總結(jié):?


前言:

對C語言來說,指針是一個難點,如果用C語言來寫數(shù)據(jù)結(jié)構(gòu)的話,掌握指針的用法是必須的,如果指針沒學(xué)好,學(xué)數(shù)據(jù)結(jié)構(gòu)很吃力。所以希望大家一定要掌握指針啊?。?!

1.指針的概念

1.指針就是個變量,用來存放地址,地址唯一表示一塊內(nèi)存空間。

ps:(內(nèi)存編號 = 地址 = 指針)

2.指針的大小是固定的4/8個字節(jié)(32位平臺/64位平臺)

2.指針的類型

指針是有類型的,指針的類型決定了指針+-整數(shù)的步長,指針解引用時候的權(quá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;
}

ba55661f49c94ab7a066716ea0918eaa.png

剛開始p1和p2地址是一樣的,但后面讓p1和p2分別進行+1,后面的結(jié)果就不同了,p1加的1是int類型的1,而p2+1加的是char類型的1。

上面我們說到指針的大小是固定的4/8個字節(jié),假設(shè)是32位平臺,那么一個指針就占4個字節(jié)。如果這時我定義一個整型指針和字符指針,那么這個整型指針在解引用時就可以訪問4個字節(jié),而字符指針就只能訪問1個字節(jié)。

3.野指針

野指針的概念就是:指針的位置是不可知的

3.1野指針的成因:

野指針的成因有兩個:1.指針未被初始化? ?2.指針的越界訪問

給大家解釋一下:

指針未被初始化

這個應(yīng)該很好理解,就是我們在創(chuàng)建指針變量的時候沒有讓它指向任何對象

例如: int* p;? ?這樣p就是一個局部變量,p就是一個隨機值?

指針的越界訪問

看一下下面的代碼:

#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;
}

先給大家解釋一下這個代碼的原理,int* p = arr; 這里arr是數(shù)組名,數(shù)組名是首元素的地址

那么現(xiàn)在p就是首元素的地址? 對p進行解引用就是*p ,*p的值就是 1

p++;? 這行代碼就是讓p的地址++;指針的大小是固定的4/8個字節(jié), int型數(shù)據(jù)在C語言中也是4/8個字節(jié),我們拿到的指針都是數(shù)據(jù)第一個字節(jié)的地址,而數(shù)組在內(nèi)存中又是連續(xù)的,p++就是剛好往后移動一個數(shù)據(jù)。

但是現(xiàn)在arr數(shù)組一共就只有5個元素,但是循環(huán)6次必然會導(dǎo)致數(shù)組的越界,那我們來看一下運行結(jié)果

7f25a0ea626045aea04d77885f090aca.png

前面5個數(shù)就是arr數(shù)組里面的數(shù),第6個值就是一個隨機值。因為當(dāng)循環(huán)到第6次時,p已經(jīng)沒有指向的對象了,此時p就是一個野指針了。

3.2如何避免野指針?

1.善于使用NULL,及時對指針進行初始化

如果你在定義指針變量的時候,就已經(jīng)想到指針變量指向的對象,那就直接進行初始化。

如果你在定義的時候,還不清楚指針指向的對象,也不清楚后面要不要使用指針,那就對指針變量賦值為NULL? ?

NULL就是空的意思,如果int *p=NULL; 那么此時p就是一個空指針,后面可以重新賦值,并不影響后面的使用。如果一個指針是空指針,在你還沒初始化前不要使用它。

2.避免指針的越界

3.避免返回局部變量的地址

4.指針的運算

看下面這段代碼:

#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++是對地址進行加減整數(shù),上面已經(jīng)介紹過了,現(xiàn)在就不過多介紹了

而(*p2)++, 我是定義了一個b變量,然后賦值給了10,然后把b的地址給了p2,*p2通過解引用得到的就是10,(*p)++? 相當(dāng)于 10++ ,得到的就是11.

看一下運行結(jié)果:

99cb2eef764e46979bb9eedd09d45640.png

ps:指針可以比較大小

指針還可以減指針

舉個例子:

#includeint main()
{
	int arr[5] = { 1,2,3,4,5 };
	printf("%d", &arr[4] - &arr[0]);
	return 0;
}

這里沒用指針變量相減,其實是一樣的。畢竟指針就是地址。

兩個指針指向同一塊空間時,指針減指針的絕對值得到的就是這兩個指針之間數(shù)據(jù)的個數(shù)。

注意這個不是 個數(shù)*數(shù)據(jù)類型的大小?C語言規(guī)定的

af9a52f60daa4d51ac506d832356e418.png

5.指針和數(shù)組

1.數(shù)組是可以通過指針來訪問的,可以參考我上面寫的代碼。

2.通常情況下 數(shù)組名是首元素的地址?

但凡事都有例外:

1.sizeof(數(shù)組名)? 得到的是整個數(shù)組的大小?

2.&+數(shù)組名 這里取出的是整個數(shù)組的地址。

3.在進行函數(shù)傳參時,如果形參是數(shù)組,可以把形參設(shè)計成指針,當(dāng)然如果形參是數(shù)組,也可以傳指針作為實參。

6.二級指針

二級指針就是用來存放一級指針(指針變量)的地址。

#includeint main()
{
	int a = 5;
	int* pa = &a;
	int** ppa = &pa;
	return 0;
}

此時pa是一級指針,ppa就是二級指針,ppa是把pa的地址取出來放在ppa里面

**ppa就是*pa找到pa,在對pa進行解引用找到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");
	}
}

對指針數(shù)組可以模擬是實現(xiàn)二維數(shù)組,arr[i]里面存放的是arr1和arr2的地址。+j是獲得每一位數(shù)組元素的地址,在來*解引用拿到里面的值。輸出那個地方也可以換成??printf("%d ", arr3[i][j]);效果是一樣的。

5f65ae621b1044ea9bb35d742de02f6c.png

總結(jié):?

指針真的很重要!指針真的很重要!指針真的很重要!(重要的事情說三遍)一定要掌握

希望這篇文章可以幫到你 (水平有限,如果有問題,歡迎大佬指正!感謝!)

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

網(wǎng)站欄目:【C語言】全面解析指針,指針知識點整理-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://muchs.cn/article4/dhgooe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、虛擬主機、搜索引擎優(yōu)化、電子商務(wù)品牌網(wǎng)站設(shè)計、企業(yè)網(wǎng)站制作

廣告

聲明:本網(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è)