资讯专栏INFORMATION COLUMN

如何区分指针,数组,函数的混合体

不知名网友 / 436人阅读

摘要:我们可以将等效指针,分析如下理解为指针,说明是一个类型的指针数组。经过上面的学习我们可能已经学会了区分指针,数组,函数的混合体,再来看一个复杂例子经过上面朋友们可以一步一步使用小鸭子原则进行分析,如果不清楚就百度搜索函数,这是中的信号函数。

下面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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125302.html

相关文章

  • PHP执行原理

    摘要:执行原理是一门应用非常简单,开发效率极高的一门语言,其弱类型的变量能省去程序员大量的定义变量类型转换等的时间和精力。程序最终被翻译为一组处理函数的顺序执行。只有减为时才会真正执行销毁操作。 PHP执行原理 php是一门应用非常简单,开发效率极高的一门语言,其弱类型的变量能省去程序员大量的定义变量、类型转换等的时间和精力。它是一种适用于web开发的动态语言。 1. php设计的原理和特点...

    silvertheo 评论0 收藏0
  • js面试题

    摘要:面试题的基本数据类型和引用数据类型基本数据类型引用数据类型和有何区别表示一个对象被定义了,值为空值表示不存在这个值。 js面试题 JS的基本数据类型和引用数据类型 基本数据类型:undefined、null、boolean、number、string、symbol引用数据类型:object、array、function null 和 undefined 有何区别? null 表示一个对...

    Baoyuan 评论0 收藏0
  • C语言指针这一篇够了(一万二千字,包含指针数组函数指针等详解)

    摘要:指针变量可以存放基本类型数据的地址,也可以存放数组函数以及其他指针变量的地址。数组名表示的是整个数组所占的字节数。在这里数组指针的类型是。这也是我们可以用数组指针来接收二维数组数组名的原因。 目录 零.前言 一.指针的定义 二.指针类型的意义 1.指针类型决定了指针解引用时一次访问几个字...

    My_Oh_My 评论0 收藏0
  • 前端面试绝对会考JS问题!【已经开源】

    摘要:借用构造函数类式继承借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。 写在前面 【前端指南】前端面试库已经开源,正在完善之中 [x] css问题 [x] html问题 [x] javascript问题 github地址 https://github.com/nanhupatar... showImg(https://segmentfault.com/img...

    renweihub 评论0 收藏0
  • JNI

    摘要:不会检查数组下标越界数组的特点元素数据类型相同元素在内存中连续的数组名代表首元素首地址指针与数组的关系堆区内存的申请及释放在堆区分配学生学号数组自己申请,还需要自己释放欢迎加入学习交流群,大家一起学习交流。 什么是JNIJNI Java Native interface 一种协议 提供一套编程框架,java和本地代码相互调用 为什么需要JNI 1.操作底层硬件,Android平台上传感...

    StonePanda 评论0 收藏0

发表评论

0条评论

不知名网友

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<