目錄
創(chuàng)新互聯(lián)公司專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、圍場網(wǎng)站定制設(shè)計、自適應品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計、商城系統(tǒng)網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應式網(wǎng)頁設(shè)計等建站業(yè)務,價格優(yōu)惠性價比高,為圍場等各大城市提供網(wǎng)站開發(fā)制作服務。一.什么是指針
?
1.指針的概念
(1)指針的初始化
(2)?指針的大小
(3)指針的解引用
2指針的分類
(1)空指針
(2)野指針
(3)指針常量
(4)常量指針
(5)二級指針
二.指針的應用
1.函數(shù)傳參
(1)值傳遞
(2)地址傳遞?
2.函數(shù)傳返回值
三.指針的總結(jié)
1.指針的種類
2.指針的應用
指針是c語言的精髓所在,如果不會比較優(yōu)雅地使用指針,也就不能說自己熟悉或者掌握c語言編程,正確且優(yōu)雅地使用,可以使程序更加簡潔高效,每一個學習c語言的小伙伴都應該學習并掌握指針。指針到底是如何成為c語言的靈魂呢,我們一起來探索指針的奧秘吧~
1.指針的概念指針是一種數(shù)據(jù)類型,它存放的是數(shù)據(jù)變量的內(nèi)存地址,定義指針的格式為?數(shù)據(jù)類型 *?指名,如int a=10;int*p=&a;這時候我們就說指針p指向了變量a,將變量a看成一個房間,房間的內(nèi)容就是10,門牌號就是0x123456,則指針p存放的就是a房間的門牌號0x123456,示意圖如下圖所示
(1)指針的初始化指針定義的時候可以初始化,初始化的格式為,數(shù)據(jù)類型 *?指針變量名=&變量名,如下圖所示
當指針指向數(shù)組的時候,由于數(shù)組變量名即為數(shù)組的首地址,故可以不用取地址符&
(2)?指針的大小指針的在操作系統(tǒng)相同的情況,無論是int型char型還是字符型的類型等指針占用的內(nèi)存大小都是一樣的
輸出結(jié)果
在64位windows操作系統(tǒng)下,幾種數(shù)據(jù)類型的指針都占用8個字節(jié)
(3)指針的解引用當定義完一個指針并指向一個變量時,我們可以通過指針的解引用符*來間接訪問變量,即定義完指針后,*p就等價于變量a,而p為變量a的內(nèi)存地址
輸出結(jié)果
再用數(shù)組來一個解引用的例子,在學習指針前,我們遍歷數(shù)組都是通過數(shù)組下標來訪問,而當我們接觸到了指針時,我們便可以利用指針來遍歷數(shù)組
輸出結(jié)果
2指針的分類 (1)空指針? 當我們利用指針進行一些操作后,為了避免后面不小心對某些變量進行操作,我們往往會在操作完成后將指針置空,空指針即指針不指向任何一個內(nèi)存空間,打印空指針將什么都不會輸出
(2)野指針? 野指針的幾種產(chǎn)生情況
1.定義指針時未初始化,未初始化的指針指向的空間將是隨機的,如果此時操作野指針則可能產(chǎn)生一些未知的錯誤
輸出結(jié)果
????2.指針訪問越界
以訪問數(shù)組為例,當利用指針訪問的時候,p的指向一旦超過數(shù)組下標,則此時p存放的地址則為未知的空間地址,此時的指針p也稱之為野指針
輸出結(jié)果?
可以看到打印第7個變量時產(chǎn)生了一個隨機值,這就是因為野指針指向的空間是隨機的
? 3.指針釋放后未置空
?? ? 我們在利用指針進行操作完之后需要將指針釋放并置空,而部分小伙伴會在釋放指針后忘記將指針置空,釋放指針實質(zhì)上是將指針指向的空間釋放,但是指針依然還在,此時指針指向的空間已經(jīng)被釋放也就是已經(jīng)不存在,則指針會指向另外的隨機空間,此時的指針也稱為野指針
(3)指針常量當定義指針并初始化時,用const修飾的位置不同而決定是指針常量還是常量指針,int *?const p,此時的指針p則為指針常量,指針變量也是變量,此時指針常量意味著指針的值不可以修改,也就是指向不變,相當于和初始化指向的空間綁定了,指針常量的性質(zhì)為指針不可修改,而指向的空間的值可以修改
對指針常量指向其他的變量,編譯器報錯并顯示指針變量為已讀,不可修改
(4)常量指針? 當用const修飾整個定義表達式,cconst int *p,此時指針p為常量指針,即指針指向的空間的值為常量,不可修改,但是指針可以指向其他的空間
當常量指針指向的變量的值修改時,編譯器報錯并顯示變量a為已讀,不可修改
(5)二級指針?指針不僅可以指向其他數(shù)據(jù)類型的變量,指針也可以指向指針,指向指針的指針稱為二級指針,此時指針存放的是一級指針變量的地址,二級指針可以通過兩次解引用訪問變量
輸出結(jié)果為
可以看到輸出結(jié)果第一行為一級指針解引用后的值,即變量a的值;第二行為二級指針一次解引用的值,即為一級指針的值,一級指針的值即為變量a的地址;第三行為二級指針二次解引用的值,即為變量a的值?
二.指針的應用 1.函數(shù)傳參 (1)值傳遞?函數(shù)的形參為普通變量時即為值傳遞,此時將實參傳入函數(shù)將不會修改,我們以交換兩個變量的值為例
可以看到在函數(shù)內(nèi)兩個變量的值交換了,但是調(diào)用完函數(shù)后兩個變量的值并沒有交換
(2)地址傳遞??函數(shù)的形參為指針變量時即為值傳遞,此時傳入實參必須傳入實參的地址,即需要取地址符&,傳入實參的地址后,在函數(shù)對形參修改將會使實參也發(fā)生相應的修改,我們以交換兩個變量的值為例
可以看到在函數(shù)內(nèi)兩個變量的值交換了,調(diào)用完函數(shù)后兩個變量的值也會相應地交換
2.函數(shù)傳返回值?在學習指針之前,我們利用函數(shù)傳返回值時只能傳遞一個值,在學到指針的時候,我們便可以在傳返回值時利用指針傳遞多個返回值,當我們某個函數(shù)的形參為數(shù)組,且返回值也為數(shù)組時,我們可以利用指針作形參和返回值,我們以冒泡排序為例,傳入任意一個數(shù)組,然后返回排序后的數(shù)組
#includeint * BubbleSort(int *a) //用指針作為形參,傳入的是數(shù)組首元素的地址
{
int i=0;
int j=0;
//冒泡排序
for(i=0;i<5;i++)
{
for(j=0;j<5-i-1;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
//排序完傳回指針
return a;
}
int main()
{
int a[5]={5,9,1,5,7};
int i=0;
int *p=BubbleSort(a);//調(diào)用完函數(shù)定義一個指針接受返回值
for(i=0;i<5;i++)
打印調(diào)用完冒泡排序的數(shù)組
{
printf("%d\n",*p);
p++;
}
return 0;
}
輸出結(jié)果為
可以看到,將數(shù)組名傳入冒泡排序函數(shù)后數(shù)組的元素進行了排序
三.指針的總結(jié) 1.指針的種類? 指針總體可以分為空指針、野指針、指針常量、常量指針、二級指針(多級指針),在學習指針是我們要盡量避免空指針和野指針,以免引起一些未知的錯誤,根據(jù)使用場景合適地選擇指針種類,可以有效地提高程序的簡潔性和可讀性
2.指針的應用? 指針的應用最常用的兩個功能就是函數(shù)傳參和函數(shù)傳返回值
? 在我們想要在函數(shù)內(nèi)修改實參時可以使用指針傳參,不過指針傳參不可濫用,防止在不需要修改實參時意外對實參進行改動
?在我們想要函數(shù)傳回數(shù)組、結(jié)構(gòu)體等多個變量值時我們可以將指向它們的指針作為返回值,在主函數(shù)調(diào)用函數(shù)后定義指針接受即可
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧