亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言指針應用實例分析

發布時間:2022-04-13 13:44:40 來源:億速云 閱讀:167 作者:iii 欄目:開發技術

這篇文章主要講解了“C語言指針應用實例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言指針應用實例分析”吧!

1、指針是什么

指針理解的2個要點:

  • 平時口語中說的指針,通常指的是指針變量,是用來存放內存地址的變量

  • 指針是內存中一個最小單元的編號,也就是地址

1.1 指針變量

我們可以通過&(取地址操作符)取出變量的內存其實地址,把地址可以存放到一個變量中,這個變量就是指針變量:

int main()
{
	int a = 1;//在內存中開辟一塊空間
	//a變量占用4個字節的空間,這里是將a的4個字節的第一個字節的地址存放在p變量中,p就是一個指針變量
	int* pa = &a;//這里我們對變量a,取出它的地址,可以使用&操作符
	printf("%p\n", &a);
	printf("%p\n", pa);
	a = 10;
	printf("%p\n", &a);
	return 0;
}

利用內存和監視來查看&a 和pa的變化:

C語言指針應用實例分析

見下圖所示:

  • &a為取變量a的地址:0x00CFFEE0

  • pa是指針變量,存放的值是變量a的地址: 0x00CFFEE0

a變量占用4個字節的空間,下圖在內存中能看到a的地址占用了4個字節,存放 00 00 00 01

C語言指針應用實例分析

內存顯示列數可根據自己調節,4列就是4個字節放一行,見下圖:

C語言指針應用實例分析

對a重新賦值10,變量a的值發生變化,但地址是不變的。

C語言指針應用實例分析

C語言指針應用實例分析

因此,指針變量,用來存放地址的變量。(存放在指針中的值都被當成地址處理)。

1.2 指針是內存中一個最小單元的編號

  • 指針是內存中一個最小單元的編號,這個最小單元是一個字節

  • 經過專家們仔細的計算和權衡后,發現一個字節給一個對應的地址是比較合適的

  • 對于32位的機器,假設有32根地址線,那么假設每根地址線在尋址的時候產生高電平(高電壓)和低電平(低電壓)就是(1或者0),32根地址線產生的地址就是:

00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
...
11111111 11111111 11111111 11111111

內存最小單元即一個字節,與其對應的地址見下圖:

C語言指針應用實例分析

因此,32位的機器就有2的32次方個地址。每個地址標識一個字節,那我們就可以給 :

2^32 Byte == 2^32/1024 KB == 2^32/1024/1024 MB == 2^32/1024/1024/1024 GB == 4 GB

4 GB的空閑進行編址。同樣的方法,那64位機器,如果給64根地址線,那能編址 8 GB 空間。

  • 在32位的機器上,地址是32個0或者1組成二進制序列,那地址就得用4個字節的空間來存儲,所以一個指針變量的大小就應該是4個字節

  • 在64位機器上,有64個地址線,那一個指針變量的大小是8個字節,才能存放一個地址

  • 指針是用來存放地址的,地址是唯一標示一塊地址空間的

  • 指針的大小在32位平臺是4個字節,在64位平臺是8個字節

int main()
{
	int a = 10;
	int* pa = &a;
	char ch = 'a';
	char* pc = &ch;
	printf("%d\n", sizeof(pa));//4
	printf("%d\n", sizeof(pc));//4
	return 0;
}

上例說明,不管什么類型的指針變量,它的大小就是4個字節。因為地址是32位0 1表示的,而指針變量就是存放地址的變量,需要4個字節存放。跟他的類型無關。

C語言指針應用實例分析

2、指針和指針類型

變量有不同的類型,整形,浮點型等。那指針同樣也有類型:

int num = 10;
p = #//num的地址保存到 p

要將&num(num的地址)保存到 p 中,我們知道 p 就是一個指針變量,那它的類型是怎樣的呢?我們給指針變量相應的類型

char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;

指針的定義方式是: type + *

  • char* 類型的指針是為了存放 char 類型變量的地址:即地址里面的變量是char 類型,占用1個字節,地址本身4個字節

  • short* 類型的指針是為了存放 short 類型變量的地址:即地址里面的變量是short類型,占用1個字節,地址本身4個字節

  • int* 類型的指針是為了存放 int 類型變量的地址:即地址里面的變量是 int 類型,占用4個字節,地址本身4個字節

2.1 指針±類型

int main()
{
	int n = 10;
	char *pc = (char*)&n;
	int *pi = &n;
	printf("%p\n", &n);
	printf("%p\n", pc);
	printf("%p\n", pc+1);
	printf("%p\n", pi);
	printf("%p\n", pi+1);
	return 0;
}

指針的類型決定了指針向前或者向后走一步有多大(距離):

  • int *向后+1,就是移動到下一個 int 類的變量的地址,就是移動4個字節

  • char *向后+1,就是移動到下一個 char 類型的變量的地址,就是移動1個字節

  • 指針的類型,是指向地址里存儲數值的類型

C語言指針應用實例分析

2.2 指針的解引用

指針的類型決定了,對指針解引用的時候有多大的權限(能操作幾個字節)

2.2.1 int* 類型的解引用
int main()
{
	int a = 0x11223344;
	int* pa = &a;
	*pa = 0;
	return 0;

int* 的指針的解引用就能訪問四個字節:

C語言指針應用實例分析

C語言指針應用實例分析

2.2.2 char* 類型的解引用
int main()
{
	int a = 0x11223344;
	char* pa = (char*)&a;//&a是int*,所以在這里強制轉換
	*pa = 0;

	return 0;
}

char* 的指針解引用就只能訪問一個字節:

C語言指針應用實例分析

C語言指針應用實例分析

3、野指針

野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)

3.1 野指針成因

3.1.1 指針未初始化
int main()
{
	int *p;//局部變量指針未初始化,默認為隨機值
	*p = 20;
	return 0;
}
3.1.2 指針越界訪問
int main()
{
	int arr[10] = {0};
	int *p = arr;
	int i = 0;
	for(i=0; i<=11; i++)//超過數組的元數個數
	{
		//當指針指向的范圍超出數組arr的范圍時,p就是野指針
		*(p++) = i;
	}
	return 0;
}
3.1.3 指針指向的空間釋放
int* test()
{
	int a = 10;
	printf("%d\n", a);
	return &a;//開辟的空間已經釋放了
}
int main()
{
	int* p = test();//函數調用結束后,開辟的內存空間釋放了
	*p = 100;
	return 0;
}

3.2 如何規避野指針

  • 指針初始化

  • 小心指針越界

  • 指針指向空間釋放即使置NULL

  • 避免返回局部變量的地址

  • 指針使用之前檢查有效性

int main()
{
	int *p = NULL;//初始化
	//....
	int a = 10;
	p = &a;
	if(p != NULL)
	{
		*p = 20;
	}
	return 0;
}

感謝各位的閱讀,以上就是“C語言指針應用實例分析”的內容了,經過本文的學習后,相信大家對C語言指針應用實例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁河县| 定日县| 崇信县| 丰镇市| 大方县| 九龙坡区| 嘉鱼县| 宣威市| 平远县| 宝山区| 庆安县| 洱源县| 江门市| 富裕县| 江孜县| 樟树市| 西盟| 三明市| 麻江县| 如皋市| 上蔡县| 牙克石市| 靖西县| 勐海县| 乌拉特前旗| 孟州市| 和平县| 虞城县| 休宁县| 莒南县| 章丘市| 长宁区| 察雅县| 平南县| 武城县| 牙克石市| 望都县| 林口县| 巴林左旗| 岗巴县| 涿州市|