中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

帶你重新認識指針(下)

發布時間:2020-07-26 11:43:06 來源:網絡 閱讀:194 作者:龍躍十二 欄目:編程語言

真的猛士,敢于直面慘淡的人生,敢于正視淋漓的鮮血。這是怎樣的哀痛者和幸福者?然而造化又常常為庸人設計,以時間的流駛,來洗滌舊跡,僅使留下淡紅的血色和微漠的悲哀。在這淡紅的血色和微漠的悲哀中,又給人暫得偷生,維持著這似人非人的世界。我不知道這樣的世界何時是一個盡頭!我們還在這樣的世上活著;我也早覺得有寫一點東西的必要了。 ——魯迅

<p align="center">本文已經收錄至我的GitHub,歡迎大家踴躍star 和 issues。</p>
<h5 align="center"><a href="https://github.com/midou-tech/articles" target="_blank">https://github.com/midou-tech/articles</a></h5>
<h5 style="color:red;text-align:center">點關注,不迷路!!! </h5>

看完我上一篇指針的講解之后很多同學反饋很不錯,有網友給私信說之前在大學里面一直搞不懂指針的問題,說到指針都是云里霧里,老師講的也是很難聽懂 ,點擊即可進入 指針(上)。也有很多網友表示非常期待指針下的文章,所以我就馬不停蹄的繼續寫,下 主要講解指針的特性以及指針安全問題。

指針的特性

指針和常量

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

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

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

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

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

指針常量

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

帶你重新認識指針(下)

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

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

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

常量指針

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

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

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

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

常量指針常量

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

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

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

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

指針和函數
函數指針
什么是函數指針

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

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

bool(*p)(char, int); 

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

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

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

函數指針使用

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

指針作為函數參數

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

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

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

 是不是歷歷在目。。。

帶你重新認識指針(下)

 這個簡單的問題,要搞明白可以學到好幾個知識點。第一個,函數棧問題;第二個,函數的參數傳遞是值傳遞還是地址傳遞;第三個,指針作為函數參數。不過我這里就不講前面兩個了,相信大家能來看指針問題說明前面基礎知識都差不多了,要是你真的不會的話,你可以找龍叔我,我一定把你整明白,微信搜索公眾號 龍躍十二 即可找到龍叔微信,同時有機會加入龍叔技術交流群,千萬別錯過喔。<img src="https://tva1.sinaimg.cn/large/006tNbRwly1gave8qqnvvg306f06pgmg.gif" style="zoom:25%;" />

<h5 style="color:red;text-align:center">求點贊

向AI問一下細節

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

AI

高邮市| 金秀| 循化| 石城县| 疏勒县| 尖扎县| 乌兰县| 绥芬河市| 红安县| 隆安县| 资溪县| 左权县| 横峰县| 房山区| 桐梓县| 内乡县| 乐亭县| 绿春县| 满城县| 京山县| 广南县| 四平市| 湘潭市| 灵武市| 奈曼旗| 安溪县| 陆良县| 泾源县| 台南县| 玛沁县| 鹤庆县| 鲁甸县| 安顺市| 高青县| 武川县| 姜堰市| 柏乡县| 通道| 贵州省| 洪湖市| 淄博市|