前言:小伙伴們又見面啦!本期內(nèi)容,博主將展開講解有關(guān)C語言中指針的上半部分基礎(chǔ)知識(shí),一起學(xué)習(xí)起來叭?。?!
目錄
一.什么是指針
二.指針類型
1.指針的解引用
2.指針+-整數(shù)
三.野指針
1.野指針成因
(1)指針未初始化
?(2)指針越界訪問
2.如何規(guī)避野指針
四.總結(jié)
一.什么是指針
- 指針是內(nèi)存中一個(gè)最小單元的編號(hào),也就是地址。
- 我們平時(shí)所說到的指針,一般都是指針變量,是用來存放內(nèi)存地址的變量。
所以說指針實(shí)際上是一個(gè)地址,而存放在指針中的值都會(huì)被當(dāng)成地址處理。
這里有一個(gè)小知識(shí)點(diǎn):指針在32位平臺(tái)上占4個(gè)字節(jié),在64位平臺(tái)上則占8個(gè)字節(jié)。具體內(nèi)容相對(duì)復(fù)雜,我們這里不做講述。
還有一點(diǎn)要注意,一個(gè)指針雖然占有四個(gè)字節(jié),但是它存儲(chǔ)的地址僅僅為一個(gè)字節(jié),也就是這四個(gè)字節(jié)的頭頭。
二.指針類型
我們知道,定義一個(gè)指針變量就跟定義一個(gè)普通的變量一樣,可以有不同的類型。
那我們又知道不同類型的變量,又會(huì)占有不同的內(nèi)存大小。
那么不同類型的指針,也會(huì)占有不同的內(nèi)存大小嗎????
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(double*));
return 0;
}
?我們知道sizeof是一個(gè)計(jì)算內(nèi)存大小的關(guān)鍵字,我們用它來測(cè)試一下,結(jié)果如下:
?令人出乎意料,不同類型的指針變量,占用的內(nèi)存大小竟然都相同,為什么呢???
事實(shí)上,我們定義不同類型的指針,只是為了用這個(gè)指針來存放這種類型的變量的地址。
例如我們定義char*類型的指針,只是為了存放char類型變量的地址。
那既然并不會(huì)影響指針的內(nèi)存大小,定義這么多類型的指針又有什么意義呢???
1.指針的解引用
什么是指針的解引用呢???
當(dāng)我們用指針變量通過地址來訪問或者修改一個(gè)變量的值,就叫解引用。
#include<stdio.h>
int main()
{
int n = 0x11223344;
int* p = &n;
*p = 0;
return 0;
}
假如我們初始化變量n的內(nèi)存大小為0x11223344,然后我們用int型的指針變量來解引用將其值改為0,我們來看它的內(nèi)存怎么變化:
?可以看出n的四個(gè)字節(jié)的內(nèi)存大小都變?yōu)榱?。
#include<stdio.h>
int main()
{
int n = 0x11223344;
char* p = &n;
*p = 0;
return 0;
}
?同樣的方式,這次我們換成char型的指針變量,又會(huì)是什么結(jié)果呢???
?可以很輕易的看出,char型的指針變量,僅僅讓n的一個(gè)字節(jié)的內(nèi)存大小變?yōu)榱?。
?這便是指針類型的意義:
指針類型決定了指針進(jìn)行解引用操作的時(shí)候,訪問幾個(gè)字節(jié)。
2.指針+-整數(shù)
#include<stdio.h>
int main()
{
int n = 5;
int* p1 = &n;
char* p2 = &n;
printf("p1 = %p\n", p1);
printf("p1 + 1 = %p\n", p1 + 1);
printf("p2 = %p\n", p2);
printf("p2 + 1 = %p\n", p1 + 1);
return 0;
}
看這段代碼,int型的指針變量p1和char型的指針變量p2的內(nèi)存地址是什么結(jié)果?
p1和p2兩個(gè)指針分別 + 1之后又會(huì)是什么結(jié)果呢?
?能夠看出,兩個(gè)指針變量是可以同時(shí)訪問一個(gè)變量的地址的。
p1+1的后的內(nèi)存跳過了4個(gè)字節(jié),而p2+1后的內(nèi)存地址僅僅之跳過了1個(gè)字節(jié)。
這也是指針類型的意義:
指針類型決定了指針進(jìn)行+-操作的時(shí)候,跳過幾個(gè)字節(jié)。
三.野指針
所謂野指針,也就是說指針指向的位置是不可知的(隨機(jī)的,不正確的,沒有明確限制的)。
1.野指針成因
(1)指針未初始化
int *p;
*p = 10;
這樣的解引用方式直接就是錯(cuò)誤的,在VS環(huán)境下直接就會(huì)報(bào)錯(cuò):
?(2)指針越界訪問
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i <= 10; i++)
{
*p = 1;
p++;
}
return 0;
}
假如我們想用一個(gè)指針來改變數(shù)組中的每一個(gè)值,但是卻不小心超過了數(shù)組的大小,這樣就造成了越界訪問,出現(xiàn)了錯(cuò)誤。
指針指向的地址超過了數(shù)組的范圍,就變成了野指針。
2.如何規(guī)避野指針
- 指針要初始化
- 小心指針越界
- 指針指向的空間釋放,及時(shí)置NULL
- 避免返回局部變量的地址
- 指針使用之前檢查有效性
這里要注意一點(diǎn),如果我們非要定義一個(gè)未知指向的指針,就要將其置NULL,也就是置0。
當(dāng)指針置NULL時(shí),也相當(dāng)于是存了一個(gè)空地址,不能對(duì)這個(gè)地址直接進(jìn)行操作。
想要操作此指針,就必須讓它指向其他已知的地址。
四.總結(jié)
以上就是有關(guān)C語言基礎(chǔ)——指針的上半部分的內(nèi)容啦,稍后博主將更新指針(下),一起期待一下叭!
喜歡博主文章的小伙伴們不要忘記一鍵三連哦!文章來源:http://www.zghlxwxcb.cn/news/detail-675850.html
我們下期再見!文章來源地址http://www.zghlxwxcb.cn/news/detail-675850.html
到了這里,關(guān)于C語言基礎(chǔ)之——指針(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!