摘要:我们可以把等价指针理解为指针,也就是说它是指针数组的一种类型。经过上面的学习,我们可能已经学会了区分指针、数组和函数的混合。让我们看一个复杂的例子。以上之后,朋友们可以用小鸭原理来一步步分析。如果不清楚,就搜索函数。这是中的信号函数。
以下六个语句声明了什么?如果不能快速分辨,那就一起学习吧。我们先来了解一下标识符,标识符是标识一个实体的符号,用于命名变量、常量、函数、语句块等。上述六个声明语句中有六个标识符:示例1、示例12、示例3、示例4、示例5和示例6。
接下来我们来学习一个原理:小鸭原理(作者原创)。小鸭子从蛋里孵出来后,看到的第一个活的动物就是它们的妈妈,妈妈走到哪里,它们就跟到哪里。小鸭原则是:标识符是与它第一次结合的类型。我们用小鸭原理来分析一下以上六种说法:1。u8 *示例1
Example1与*结合,所以example1是一个指针。
2、u8 *示例2[3]
这里耦合符号和[]和[]的优先级比对方高(如果不知道运算的优先级,可以看我的另一篇文章《C语言中记忆运算优先级的公式》)。example2先与[]组合,所以example2[]是一个数组。我们可以将example2[]等同于一个数组,分析如下:
U8 example2[3]理解为U8数组,意味着example2是u8类型的数组指针。
3 、*u8(例3)[3]
这里耦合符号是(),和[],优先级顺序是:()>[] > *。()起分组的作用(优先级递增),example3和first结合,所以*example3是指针。我们可以将(*example3)等同于“指针”,分析如下:
U8 (*example3)[3]理解为“U8 pointer [3]”,这意味着example3是u8类型的指针数组。
4、u8 *示例4()
这里,耦合符号是()和*。()的优先级高于*,example4先与()结合,所以example4()是一个函数。我们可以将example4()等同于一个函数,并对其进行如下分析:
U8 example4()理解为*“u8 *函数”,意思是example4是一个返回类型为u8 * *的函数。
5、u8(*例5)()
这里,耦合符号是()和()。example5与first组合,所以example5是一个指针。我们可以把example5等同于一个*指针,分析如下:
U8 (*example5)()理解为U8指针(),表示example5是返回类型u8函数的指针。
可能关于u8指针();有些朋友很难理解。让我们来分解一下:
u8 a;u8 * a;
是u8类型变量,*a是u8类型指针。
typedef结构狗
{
char name[20];
}狗_ t;
dog_t我的狗;dog _ t * my _ dog
My_dog是dog_t类型结构,*my_dog是指向dog_t类型结构的指针。
我们可以认为nnn是X型变量,*nnn是X型变量指针。
根据这个原理:u8 example5()是函数,u8 (*example5)()是函数指针。
6、u8(*例6[3])()
这里,耦合符号是()、*和[]。example6先与[]组合,所以example6[]是一个数组。我们可以将example6[]等同于“数组”:
U8 (*example6[3])()理解为u8( * array)(),是函数指针,表示example6是函数指针的数组。
经过上面的学习,我们可能已经学会了区分指针、数组和函数的混合。让我们看一个复杂的例子:
void (*signal (int signo,void(* func)(int)))(int);
以上之后,朋友们可以用小鸭原理来一步步分析。如果不清楚,百度会搜索“信号函数”,也就是linux中的信号函数。
让我们仔细看看指针在计算机中是如何工作的。
空谈不值钱,给我看看代码!我们来看看下面的代码:反汇编代码如下:data1和data_p在RAM中的位置分别是0x1fff8009 (data1),0x1fff800c (* data_p)。我们来看看RAM中data1和data_p的值(程序运行后的值)。Data _ p该指针变量存储data1的RAM地址0x1ffp。
不想喜欢创作的朋友喜欢,喜欢,转发,关注。作者:李伟Github:liyinuoman2017
评论前必须登录!
注册