摘要:我們可以將等效指針,分析如下理解為指針,說明是一個類型的指針數組。經過上面的學習我們可能已經學會了區分指針,數組,函數的混合體,再來看一個復雜例子經過上面朋友們可以一步一步使用小鴨子原則進行分析,如果不清楚就百度搜索函數,這是中的信號函數。
下面6個聲明語句分別聲明的是什么?
如果不能快速地分清,我們就來一起來學習一下。首先我們先了解一下標識符,標識符是標識某個實體的一個符號,用于給變量、常量、函數、語句塊等命名。上面6個聲明語句中有6個標識符:example1,example12 ,example3 ,example4 ,example5 ,example6 。
接下來我們來學習一個原則:小鴨子原則(作者原創)。小鴨子從蛋中孵化出來之后,最先看到的活動物是它們的母親,母親走到哪里,它們就跟到哪里。
小鴨子原則就是:標識符最先跟誰結合,它就是什么類型的。我們運用小鴨子原則分析一下上面6條語句:
1、u8 *example1
example1和*結合 ,因此example1是一個指針。
2、u8 *example2[3]
這里耦合符號有和[],[]的優先級高于(如果不清楚運算優先級的朋友們可以看一下我另外一篇文章《C語言運算優先級記憶口訣》),example2先和[]結合 ,因此example2[]是個數組。我們可以將example2[]等效為 數組,分析如下:
u8 example2[3] 理解為 u8 數組 ,說明example2是一個u8類型的數組指針。
3、*u8 (example3)[3]
這里耦合符號有(),和[],優先級順序為:() > [] > * 。()起到聚組作用(提高優先級),example3先和結合,因此*example3是指針。我們可以將(*example3)等效 ”指針”,分析如下:
u8 (*example3)[3] 理解為 “ u8 指針[3] ”, 說明example3 是一個u8類型的指針數組。
4、u8 *example4()
這里耦合符號有()和*,()的優先級高于* ,example4先和()結合,因此example4()是 函數,我們可以將example4()等效 函數,分析如下:
u8 example4() 理解為*“ u8* 函數”,說明example4 是一個返回類型為u8*的函數**。
5、u8 (*example5)()
這里耦合符號有(),和(),example5先和結合,因此example5是指針,我們可以將example5等效為* 指針,分析如下:
u8 (*example5)() 理解為 u8 指針() ,說明example5是一個返回類型u8函數指針。
可能關于u8 指針();有些朋友難以理解。我們來分解一下:
u8 a; u8 *a;
a是u8 類型變量,*a是u8 類型指針
typedef struct dog
{
char name[20];
}dog_t;
dog_t my_dog; dog_t *my_dog;
my_dog是一個dog_t類型結構體,*my_dog是一個dog_t類型結構體指針
我們可以認為 nnn 是一個x類型變量,*nnn是一個x類型變量指針。
根據這個原則:u8 example5() 是個函數 , u8 (*example5)()是個函數指針。
6、u8 (*example6[3])()
這里耦合符號有(),*和[],example6先和[]結合,因此example6[]是一個數組,我們可以將example6[]等效為“數組”:
u8 (*example6[3])() 理解為 u8( * 數組)(),這是一個函數指針,說明example6是一個函數指針數組。
經過上面的學習我們可能已經學會了區分指針,數組,函數的混合體,再來看一個復雜例子:
void (*signal (int signo,void (*func)(int) ) ) (int) ;
經過上面朋友們可以一步一步使用小鴨子原則進行分析,如果不清楚就百度搜索“signal函數”,這是linux中的信號函數。
下面我們深入研究一下指針在計算機中是怎么工作的。
talk is cheap, show me the code! 我們一起來看如下代碼:
反匯編代碼如下:
data1和data_p 這兩個變量在RAM中的位置為:0x1fff8009(data1) ,0x1fff800c(*data_p)
我們再一起看看data1和 data_p 這兩個變量在RAM中值(程序運行完之后的值)
data_p 這個指針變量存放著data1的RAM地址0X1FFF8009 (09 80 FF 1F 為小端模式)
創作不易希望喜歡的朋友們點贊,轉發,關注。
作者:李巍
Github:liyinuoman2017
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/125302.html
摘要:執行原理是一門應用非常簡單,開發效率極高的一門語言,其弱類型的變量能省去程序員大量的定義變量類型轉換等的時間和精力。程序最終被翻譯為一組處理函數的順序執行。只有減為時才會真正執行銷毀操作。 PHP執行原理 php是一門應用非常簡單,開發效率極高的一門語言,其弱類型的變量能省去程序員大量的定義變量、類型轉換等的時間和精力。它是一種適用于web開發的動態語言。 1. php設計的原理和特點...
摘要:指針變量可以存放基本類型數據的地址,也可以存放數組函數以及其他指針變量的地址。數組名表示的是整個數組所占的字節數。在這里數組指針的類型是。這也是我們可以用數組指針來接收二維數組數組名的原因。 目錄 零.前言 一.指針的定義 二.指針類型的意義 1.指針類型決定了指針解引用時一次訪問幾個字...
摘要:借用構造函數類式繼承借用構造函數雖然解決了剛才兩種問題,但沒有原型,則復用無從談起。 寫在前面 【前端指南】前端面試庫已經開源,正在完善之中 [x] css問題 [x] html問題 [x] javascript問題 github地址 https://github.com/nanhupatar... showImg(https://segmentfault.com/img...
摘要:不會檢查數組下標越界數組的特點元素數據類型相同元素在內存中連續的數組名代表首元素首地址指針與數組的關系堆區內存的申請及釋放在堆區分配學生學號數組自己申請,還需要自己釋放歡迎加入學習交流群,大家一起學習交流。 什么是JNIJNI Java Native interface 一種協議 提供一套編程框架,java和本地代碼相互調用 為什么需要JNI 1.操作底層硬件,Android平臺上傳感...
閱讀 3801·2023-01-11 11:02
閱讀 4307·2023-01-11 11:02
閱讀 3130·2023-01-11 11:02
閱讀 5238·2023-01-11 11:02
閱讀 4802·2023-01-11 11:02
閱讀 5575·2023-01-11 11:02
閱讀 5379·2023-01-11 11:02
閱讀 4080·2023-01-11 11:02