c語言中的指針是什么-創(chuàng)新互聯(lián)

本文以c語言中的指針為例,為大家分析c語言中的指針和常量的作用以及使用方法,閱讀完整文相信大家對c語言中的指針和常量有了一定的認識。

目前創(chuàng)新互聯(lián)建站已為數(shù)千家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)絡空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設計、五蓮網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

指針的特性

指針和常量

先說下什么是常量,常量就是不可變的量,一旦定義該常量,其值在整個程序生命周期都是不可變的,常量存放在虛擬地址空間的常量區(qū)。

在C語言里面有兩種定義常量的方法。

  • 使用const關(guān)鍵字 ,const 定義的是變量不是常量,只是這個變量的值不允許改變是常變量,帶有類型。編譯運行的時候起作用存在類型檢查。

  • 使用#define預處理器, define 定義的是不帶類型的常數(shù),只進行簡單的字符替換。在預編譯的時候起作用,不存在類型檢查。

其實很多時候我們錯誤的以為常量就是const 修飾的變量,這個說法其實是有瑕疵的。

指針常量

很多網(wǎng)友在學習指針和指針的特性等問題上總是會繞進去,其實不要繞進去最重要的一點是 要把握住核心本質(zhì)。

本質(zhì)上是一個常量,指針用來說明常量的類型,表示該常量是一個指針類型的常量。在指針常量中,指針自身的值是一個常量,不可改變,始終指向同一個地址。在定義的同時必須初始化

int num = 5;
int *const p = #  // p為一個常量,擁有常量的屬性。
*p = 70;
int snum = 100;
int *sp = &snum;
p = sp;

聰明的你一定看出上面代碼有個地方會報錯,是的 p 被我們聲明為一個指針常量,此時指針p具有了常量的屬性,其不能在改變指向,但是其指向的值是可以改變的。所以報錯的代碼是p = sp這句。

常量指針

常量指針本質(zhì)上是一個指針,常量表示指針指向的內(nèi)容,說明該指針指向一個“常量”。在常量指針中,指針指向的內(nèi)容是不可改變的,指針看起來好像指向了一個常量。

int num = 5;
int const *p = #  //常量指針
const int *sp = #  //常量指針
*p = 20;
int snum = 100;
p = &snum;  //改變指向
sp = &snum;

是不是又發(fā)現(xiàn)上面的代碼有一處報錯,你太聰明了,基本搞懂了常量和指針的本質(zhì)。指針p和sp只是申明格式不同,本質(zhì)完全一樣。p被聲明為一個指針,指向一個常量。換句話說就是一個常量的地址存放在指針p中。此時報錯的就是*p = 20,因為常量是不可變的。

到這里你基本掌握了常量和指針的關(guān)系,其實還是很簡單的,也沒大家在學校學的那么繞。接下來給大家在介紹一個進階的關(guān)系。

常量指針常量

本質(zhì)上是一個常量,該常量被一個常量指針指向。也就是說一個常量指針里面放置一個常量的地址,千萬不要多看一眼這句話,你會被繞進去。

const int num = 5;  //一個不可變的常量
const int * const p = #  //一個存放常量地址的常量指針

千萬不要繞進去了,其實認真理解了上面的指針常量和常量指針的問題,這個問題看起來會簡單很多,就是一個常量,和一個常量指針。num是一個不可改變的常量,p只一個指針,該指針也是不可改變指向的。

指針和常量這個問題在面試中會被問到,好好理解下,同時有助于你更好的理解指針。

指針和函數(shù)
函數(shù)指針
什么是函數(shù)指針

如果在程序中定義了一個函數(shù),那么在編譯時系統(tǒng)就會為這個函數(shù)代碼分配一段存儲空間,這段存儲空間的首地址稱為這個函數(shù)的地址。而且函數(shù)名表示的就是這個地址。既然是地址我們就可以定義一個指針變量來存放,這個指針變量就叫作函數(shù)指針變量,簡稱函數(shù)指針。

函數(shù)指針的定義和普通指針不太一樣。函數(shù)返回值類型 (* 指針變量名) (函數(shù)參數(shù)列表);

bool(*p)(char, int);

還是很簡單的,這就知道怎么定義一個函數(shù)指針變量了,當然也有很復雜的函數(shù)指針變量,面試的時候面試官可能會問一些變態(tài)的面試題,比如:

int (*(void (*)())0)();
void (*signal(int , void(*)(int)))(int

不過還是那句話,要把握核心本質(zhì),函數(shù)指針的核心本質(zhì)是:函數(shù)返回值類型 (* 指針變量名) (函數(shù)參數(shù)列表);

函數(shù)指針使用

很多人會說,搞這么難干嘛,平時有使用么?哈哈,還真的經(jīng)常用到,尤其是標準庫中用的那叫一個多,比如sort中的比較函數(shù)就是一個函數(shù)指針。

指針作為函數(shù)參數(shù)

用指針變量作函數(shù)參數(shù)可以將函數(shù)外部的地址傳遞到函數(shù)內(nèi)部,使得在函數(shù)內(nèi)部可以操作函數(shù)外部的數(shù)據(jù),并且這些數(shù)據(jù)不會隨著函數(shù)的結(jié)束而被銷毀。

這不得不使我想起一個經(jīng)典案例,大學老師一定會講的,而且當時也是很多同學一直半解的。

void swap(int a,int b){
  int tmp = a;
  a = b;
  b = tmp;
}
int main(){
  int x = 10;
  int x = 20;
  printf("swap before:%d,%d",x,y);
  swap(a,b);
  printf("swap after:%d,%d",x,y);
  return 0;
}

看完上述內(nèi)容,你們對c語言中的指針有進一步的了解嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

分享名稱:c語言中的指針是什么-創(chuàng)新互聯(lián)
分享URL:http://muchs.cn/article12/ddcedc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站設計公司品牌網(wǎng)站設計、定制網(wǎng)站品牌網(wǎng)站建設、網(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)站