1. 程式人生 > >C指標分享之“複雜指標”

C指標分享之“複雜指標”

上一篇的“基礎指標”都已經熟練掌握了吧,小夥伴們。今天我們加深點難度,來看看“複雜指標”。在以後的分享中,我將循序漸進的把指標引入實戰的專案中,所以,現在我們要做的就是踏踏實實的打好基礎,Let’s Begin。延續我們之前的風格,通過例子讓你掌握“複雜指標”。

1、int (*func) (int *p) <函式指標>

分析

         (1).*func: 表示func是一個指標;

         (2).(*func) (): 表示(*func) 是一個函式;

         (3).func: 表示指向這類函式的指標,這類函式帶有int*型別的引數,並且返回值是int型別;

         結論

         func是一個指向函式的指標,該函式有一個int*引數,並返回一個整型數。

    2、int(*func) (int *p, int (*f)(int *)) <函式指標>

         分析

         (1).*func: 表示func是一個指標;

         (2).(*func) (): 表示(*func) 是一個函式;

         (3).func: 表示指向這類函式的指標,這類函式帶有兩個引數,且返回值是int型別。其中,一個引數是int*型別,另一個引數是函式指標;

         結論

         func是一個指向函式的指標,該函式有一兩個引數,一個是int*,另一個是int*型別的函式指標,該函式返回一個整型數。

    3、int (*func[5]) (int *p)

         分析

         (1).(*func [5]): 表示func是含有5個元素的陣列指標;

         (2).(*func [5]) (): 表示(*func [5]) 是一個函式;

         (3).func: 表示陣列中的元素是指向這類函式的指標,這類函式有一個int*型別的引數,且返回值是int型別;

         結論

         func是有5個指標的陣列,該指標指向一個函式,該函式有一個int*型別的引數並返回一個整型數。

    4、int (*(*func)[5]) (int *p)

         分析

         (1).*func: 表示func是一個指標;

         (2).(*func) [5]: 表示這個指標指向一個數組;

         (3).(*(*func) [5]): 表示陣列中的元素是指標;

         (4).(*(*func) [5]) (): 表示陣列的元素是指向函式的指標;

         結論

         func是一個指向陣列的指標,這個陣列的元素是函式指標,這些指標指向帶有int*型別形參,且返回值是int型別的函式。

    5、int (*(*func) (int *p)) [5]

         分析

         (1).*func: 表示func是一個指標;

         (2).(*func) (): 表示func是一個指向函式的指標(即函式指標);

         (3).(*(*func) ()) ——> 替換為:(*F);

         (4).(*F) [5]: 表示F是一個指向陣列的指標;

         (5).將F替換回去;

         結論

         func是一個函式指標,這類函式有一個int*型別的形參,返回值是指向陣列的指標,所指向的陣列的元素是具有5個int型別元素的陣列。

That’s all.到這裡,就分析完我們在平時工作中可能會用到的較為複雜的指標,看完是什麼感覺呢?思路清晰?or 蒙圈?淡定,淡定,小夥伴們,經過上述例子的分析,我來總結一下如何解讀複雜指標,只有做到正確無誤的解讀才能在以後的工作中熟練的使用哦。

Tips】:

使用“右左法則”:首先從未定義的識別符號(本文中指的是func<亦可理解為變數>)最裡面的圓括號看,然後向它右邊看,再向左看。每當遇到圓括號時,就應該掉轉閱讀方向。一旦解析完圓括號裡面所有的內容,就跳出圓括號。重複以上過程,直到整個宣告解析完畢。

希望通過這兩篇對指標專門的講解,我們能夠熟練的解讀出任意指標的宣告。沒有什麼捷徑哦,就是練習,練習,練習。

歡迎關注“C程式媛”微信公眾號,讓我們一起在C語言的道路上一直走下去吧。

相關推薦

C指標分享複雜指標

上一篇的“基礎指標”都已經熟練掌握了吧,小夥伴們。今天我們加深點難度,來看看“複雜指標”。在以後的分享中,我將循序漸進的把指標引入實戰的專案中,所以,現在我們要做的就是踏踏實實的打好基礎,Let’s Begin。延續我們之前的風格,通過例子讓你掌握“複雜指標”。 1、int

C語言複雜指標簡析

指標陣列和陣列指標 指標陣列:首先它是一個數組,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是“儲存指標的陣列”的簡稱。 陣列指標:首先它是一個指標,它指向一個數組。在 32 位系統下永遠是佔 4 個位元組,至於它指向的陣列佔多少位元組,不知道。

c檔案操作位置指標設定函式fseek

fseek 原型:int fseek(FILE *stream, long offset, int fromwhere); 功能:重定位流(資料流/檔案)上的檔案內部位置指標 注意:不是定位檔案指標(

C語言自學指標理解

目的: 通過以下學習,希望能理解指標的概念,理解指標和陣列的關係,理解指標的定義,掌握指標的用法。 1. 簡述   用C語言寫的程式碼基本上都用到指標,掌握好指標的概念對學好C有很大幫助。 為了方便理解我們可以把指

C++智慧指標std::shared_ptr簡單使用和理解

1  智慧指標std::shared_ptr相關知識和如何使用 我們這裡先說下智慧指標std::shared_ptr,因為我看到我我們專案c++程式碼裡面用得很多,我不是不會,所以記錄學習下 先讓ubuntu終端支援c++11,如果自己的電腦還沒配置號,可以先看下我的這篇部落格

C++小知識——記憶體管理智慧指標

在C++中,動態記憶體的管理是通過一對運算子來完成的: 1)new:在動態記憶體中為物件分配空間並返回一個指向該物件的指標 2)delete:接受一個動態物件的指標,銷燬該物件,並釋放與之關聯的記憶體 因為這樣的原因,我們時常很難確保在正確的時間去釋放記憶體,甚至我們忘記了去釋放記憶體,這

C++智慧指標和普通指標單例模式兩種實現

1  問題 實現c++的單例模式,這裡測試分別寫了通過智慧指標返回物件和普通返回指標     2  程式碼測試 include <iostream> #include <mutex> #include <m

c++ 入門物件指標

我們想 像使用基本資料型別一樣使用類,自然,類自然也有指標,我們通過下面的程式碼來領教一下物件指標存在的意義: 1 # include "iostream" 2 # include "string" 3 # include "ctime" 4 # include "cstdlib" 5 co

c++ primer plus書--c++函式, 陣列引數與指標的關係2

陣列怎麼在函式的引數中進行傳遞: // simple function #include "iostream" using namespace std; const int Size = 8; // 函式原型, 可以不寫變數名, 變數名也可以與函式定義的變數名不同 int sum_arr(in

C++ premier plus書--C++函式, 陣列引數與指標的關係1

C++的實參和形參 double cube(double x); int main()  {     int a = 5;     cube(a); } 這裡a被稱為實參, x被稱為形參, 形參就是用於接收傳遞值的變數,

c++ 智慧指標:儘量使用std::make_unique和std::make_shared而不直接使用new

關於make_unique的構造及使用例程,MSDN的講解非常詳細 (https://msdn.microsoft.com/zh-cn/library/dn439780.aspx ) 使用過程中,主要有這麼幾個關鍵點: 1.  make_unique 同 uni

C++Boost庫學習智慧指標 shared_ptr

目錄 1.共享指標shared_ptr ^   使用例子 ^ #include<boost/shared_ptr.hpp> using namespace boost; using std::cout; using std::endl; str

C++語言程式設計基礎》學習陣列指標與字串

陣列元素在記憶體中順次存放,它們的地址是連續的。元素間實體地址上的相鄰,對應著邏輯次序上的相鄰。 陣列名字是陣列首元素的記憶體地址,陣列名是常量,不能被賦值 陣列名是陣列的指標,指向首個元素的地址,多維陣列的n-1維是指標一維陣列初始化: 在定義陣列時給出陣列元素的初始值:列

C語言二級指標

#include<stdio.h>int main(){ int a=10;            //宣告一個int型變數a int

C++知識點備忘錄函式、指標(五)

1、引數為空 void say_hi():在C++中,括號為空與在括號中使用關鍵字void是等效的——意味著函式沒有引數。 2、傳遞陣列 為將陣列型別和元素數量告訴陣列處理函式,請通過兩個不同的引數來傳遞他們:         void fillArray(int a

C語言指標指標陣列、陣列指標、函式指標、二重指標、泛型函式

指標陣列:數組裡面的每個元素都是指標;char*  array[]={"hello","world","ooo"};理解:陣列中有三個元素,每個元素都是char*型別,陣列中儲存的是三個字串的首地址;64位的作業系統中指標佔8個位元組;32位作業系統指標佔4個位元組;注意:指

【原始碼分享】經典指標和K線圖系列MACD

最近從經典技術指標開始學習量化策略,有些在talib中有打包好的函式,但我還是希望自己在編的過程中學習策略的思想、進一步改進基礎策略。今天學習了移動平滑異同平均線(Moving Average Convergence Divergence,簡稱MACD指標)策略。MACD是查拉爾·阿佩爾(Geral

C語言指標專題一:指標變數和指標所指向的記憶體空間是兩個不同的概念

指標變數和指標所指向的記憶體空間是兩個不同的概念 char*p = "123456";//p是一個指標變數存放在臨時棧區,"123456"是一個字串常量存放在常量區,變數p儲存的是字串的地址 char*str = (char*)malloc(100);//將分配的100位

C++複習筆記(六)函式指標和函式模板、類模板

一、函式指標 函式指標在C語言中的作用類似於c++中的多型,都是可以實現框架的搭建,程式碼的相容性高。 函式三要素:名稱、引數、返回值 C語言可以通過typedef為函式型別重新命名,語法 typedef  返回值型別(型別名稱)(引數列表);如下程式碼所示: #in

C指標程式設計道(四)- 指向檔案型別的指標

檔案結構體和檔案指標 // 在c語言中,對檔案的操作一般是用庫函式來實現的 // ANSI(美國國家標準學會)規定了標準的輸入輸出函式,用他們對檔案進行讀寫以規範和提高程式設計效率 // 每個被使用的檔案在記憶體中都會開闢一個區,用來存放檔案的有關資訊,而