摘要:我們可以將等效指針,分析如下理解為指針,說明是一個類型的指針數(shù)組。經(jīng)過上面的學(xué)習(xí)我們可能已經(jīng)學(xué)會了區(qū)分指針,數(shù)組,函數(shù)的混合體,再來看一個復(fù)雜例子經(jīng)過上面朋友們可以一步一步使用小鴨子原則進(jìn)行分析,如果不清楚就百度搜索函數(shù),這是中的信號函數(shù)。
下面6個聲明語句分別聲明的是什么?
如果不能快速地分清,我們就來一起來學(xué)習(xí)一下。首先我們先了解一下標(biāo)識符,標(biāo)識符是標(biāo)識某個實體的一個符號,用于給變量、常量、函數(shù)、語句塊等命名。上面6個聲明語句中有6個標(biāo)識符:example1,example12 ,example3 ,example4 ,example5 ,example6 。
接下來我們來學(xué)習(xí)一個原則:小鴨子原則(作者原創(chuàng))。小鴨子從蛋中孵化出來之后,最先看到的活動物是它們的母親,母親走到哪里,它們就跟到哪里。
小鴨子原則就是:標(biāo)識符最先跟誰結(jié)合,它就是什么類型的。我們運用小鴨子原則分析一下上面6條語句:
1、u8 *example1
example1和*結(jié)合 ,因此example1是一個指針。
2、u8 *example2[3]
這里耦合符號有和[],[]的優(yōu)先級高于(如果不清楚運算優(yōu)先級的朋友們可以看一下我另外一篇文章《C語言運算優(yōu)先級記憶口訣》),example2先和[]結(jié)合 ,因此example2[]是個數(shù)組。我們可以將example2[]等效為 數(shù)組,分析如下:
u8 example2[3] 理解為 u8 數(shù)組 ,說明example2是一個u8類型的數(shù)組指針。
3、*u8 (example3)[3]
這里耦合符號有(),和[],優(yōu)先級順序為:() > [] > * 。()起到聚組作用(提高優(yōu)先級),example3先和結(jié)合,因此*example3是指針。我們可以將(*example3)等效 ”指針”,分析如下:
u8 (*example3)[3] 理解為 “ u8 指針[3] ”, 說明example3 是一個u8類型的指針數(shù)組。
4、u8 *example4()
這里耦合符號有()和*,()的優(yōu)先級高于* ,example4先和()結(jié)合,因此example4()是 函數(shù),我們可以將example4()等效 函數(shù),分析如下:
u8 example4() 理解為*“ u8* 函數(shù)”,說明example4 是一個返回類型為u8*的函數(shù)**。
5、u8 (*example5)()
這里耦合符號有(),和(),example5先和結(jié)合,因此example5是指針,我們可以將example5等效為* 指針,分析如下:
u8 (*example5)() 理解為 u8 指針() ,說明example5是一個返回類型u8函數(shù)指針。
可能關(guān)于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類型結(jié)構(gòu)體,*my_dog是一個dog_t類型結(jié)構(gòu)體指針
我們可以認(rèn)為 nnn 是一個x類型變量,*nnn是一個x類型變量指針。
根據(jù)這個原則:u8 example5() 是個函數(shù) , u8 (*example5)()是個函數(shù)指針。
6、u8 (*example6[3])()
這里耦合符號有(),*和[],example6先和[]結(jié)合,因此example6[]是一個數(shù)組,我們可以將example6[]等效為“數(shù)組”:
u8 (*example6[3])() 理解為 u8( * 數(shù)組)(),這是一個函數(shù)指針,說明example6是一個函數(shù)指針數(shù)組。
經(jīng)過上面的學(xué)習(xí)我們可能已經(jīng)學(xué)會了區(qū)分指針,數(shù)組,函數(shù)的混合體,再來看一個復(fù)雜例子:
void (*signal (int signo,void (*func)(int) ) ) (int) ;
經(jīng)過上面朋友們可以一步一步使用小鴨子原則進(jìn)行分析,如果不清楚就百度搜索“signal函數(shù)”,這是linux中的信號函數(shù)。
下面我們深入研究一下指針在計算機中是怎么工作的。
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 為小端模式)
創(chuàng)作不易希望喜歡的朋友們點贊,轉(zhuǎn)發(fā),關(guān)注。
作者:李巍
Github:liyinuoman2017
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/125302.html
摘要:執(zhí)行原理是一門應(yīng)用非常簡單,開發(fā)效率極高的一門語言,其弱類型的變量能省去程序員大量的定義變量類型轉(zhuǎn)換等的時間和精力。程序最終被翻譯為一組處理函數(shù)的順序執(zhí)行。只有減為時才會真正執(zhí)行銷毀操作。 PHP執(zhí)行原理 php是一門應(yīng)用非常簡單,開發(fā)效率極高的一門語言,其弱類型的變量能省去程序員大量的定義變量、類型轉(zhuǎn)換等的時間和精力。它是一種適用于web開發(fā)的動態(tài)語言。 1. php設(shè)計的原理和特點...
摘要:面試題的基本數(shù)據(jù)類型和引用數(shù)據(jù)類型基本數(shù)據(jù)類型引用數(shù)據(jù)類型和有何區(qū)別表示一個對象被定義了,值為空值表示不存在這個值。 js面試題 JS的基本數(shù)據(jù)類型和引用數(shù)據(jù)類型 基本數(shù)據(jù)類型:undefined、null、boolean、number、string、symbol引用數(shù)據(jù)類型:object、array、function null 和 undefined 有何區(qū)別? null 表示一個對...
摘要:指針變量可以存放基本類型數(shù)據(jù)的地址,也可以存放數(shù)組函數(shù)以及其他指針變量的地址。數(shù)組名表示的是整個數(shù)組所占的字節(jié)數(shù)。在這里數(shù)組指針的類型是。這也是我們可以用數(shù)組指針來接收二維數(shù)組數(shù)組名的原因。 目錄 零.前言 一.指針的定義 二.指針類型的意義 1.指針類型決定了指針解引用時一次訪問幾個字...
摘要:借用構(gòu)造函數(shù)類式繼承借用構(gòu)造函數(shù)雖然解決了剛才兩種問題,但沒有原型,則復(fù)用無從談起。 寫在前面 【前端指南】前端面試庫已經(jīng)開源,正在完善之中 [x] css問題 [x] html問題 [x] javascript問題 github地址 https://github.com/nanhupatar... showImg(https://segmentfault.com/img...
摘要:不會檢查數(shù)組下標(biāo)越界數(shù)組的特點元素數(shù)據(jù)類型相同元素在內(nèi)存中連續(xù)的數(shù)組名代表首元素首地址指針與數(shù)組的關(guān)系堆區(qū)內(nèi)存的申請及釋放在堆區(qū)分配學(xué)生學(xué)號數(shù)組自己申請,還需要自己釋放歡迎加入學(xué)習(xí)交流群,大家一起學(xué)習(xí)交流。 什么是JNIJNI Java Native interface 一種協(xié)議 提供一套編程框架,java和本地代碼相互調(diào)用 為什么需要JNI 1.操作底層硬件,Android平臺上傳感...
閱讀 3735·2023-01-11 11:02
閱讀 4244·2023-01-11 11:02
閱讀 3050·2023-01-11 11:02
閱讀 5180·2023-01-11 11:02
閱讀 4737·2023-01-11 11:02
閱讀 5534·2023-01-11 11:02
閱讀 5313·2023-01-11 11:02
閱讀 3986·2023-01-11 11:02