下面6个声明语句分别声明的是什么?

如果不能快速地分清,我们就来一起来学习一下。首先我们先了解一下标识符,标识符是标识某个实体的一个符号,用于给变量、常量、函数、语句块等命名。上面6个声明语句中有6个标识符:example1,example12 ,example3 ,example4 ,example5 ,example6 。

接下来我们来学习一个原则:小鸭子原则(作者原创)。小鸭子从蛋中孵化出来之后,最先看到的活动物是它们的母亲,母亲走到哪里,它们就跟到哪里。

小鸭子原则:标识符最先跟谁结合,它就是什么类型的。我们运用小鸭子原则分析一下上面6条语句:

1、u8 *example1

example1和*结合 ,example1是一个指针,因此example1是一个u8类型的指针

2、u8 *example2[3]

这里耦合符号有和[],[]的优先级高于(如果不清楚运算优先级的朋友们可以看一下我另外一篇文章《C语言运算优先级记忆口诀》),example2先和[]结合 ,因此example2[]是个数组。我们可以将example2[]等效为 数组,分析如下:

u8 *example2[3] 理解为 " u8 *数组 ",example2是一个数组,数组的成员是u8类型的指针,因此example2 是一个u8类型的指针数组

3、u8 (*example3)[3]

这里耦合符号有(),和[],优先级顺序为:() > [] > * 。()起到聚组作用(提高优先级),example3先和结合,因此*example3是指针。我们可以将(*example3)等效 ”指针”,分析如下:

u8 (*example3)[3] 理解为 “ u8 指针[3] ”, example3 是一个指针,指针指向的对象是 u8类型的数组,因此example3是一个u8类型的数组指针

4、u8 *example4()

这里耦合符号有()和*,()的优先级高于* ,example4先和()结合,因此example4()是 函数,我们可以将example4()等效 函数,分析如下:

u8 * example4() 理解为 u8* 函数,example4 是一个函数,返回类型为 u8* 类型,因此example4是一个返回类型为 u8* 类型函数

5、u8 (*example5)()

这里耦合符号有(),和(),example5先和结合,因此example5是指针,我们可以将example5等效为* 指针,分析如下:

u8 (*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是一个数组,数组的成员是返回类型为u8函数指针,因此example6是一个返回类型为u8 函数指针数组

经过上面的学习我们可能已经学会了区分指针,数组,函数的混合体,再来看一个复杂例子:

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

C语言指针,数组,函数相关推荐

  1. C语言指针(函数指针数组,二级指针)

    int (*p[num])( char*,int,int );int (*(*p)[num])(int a); 上一篇博客最后的两个例子的答案分别是:函数指针数组,函数指针数组的指针. 函数指针数组指 ...

  2. C语言 指针数组和数组指针区别 - C语言零基础入门教程

    目录 一.简介 1.数组 2.指针 3.指针和数组区别 二.指针数组和数组指针区别 1.指针数组 2.数组指针 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> ...

  3. C语言 指针数组 - C语言零基础入门教程

    目录 一.简介 1.数组 2.指针 3.指针和数组区别 二.指针数组 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 1.数组 ...

  4. c语言指针数组 难点总结,C语言指针与数组的难点分析.pdf

    C语言指针与数组的难点分析,c语言指针数组,c语言二维数组指针,c语言指针数组初始化,c语言函数指针数组,c语言数组与指针,c语言结构体数组指针,c语言指向数组的指针,c语言字符串数组指针,c语言数组 ...

  5. C语言指针数组与数组指针的区别

    C语言指针数组与数组指针的区别 首先,顾名思义 数组指针是一个指针,是指向一个数组的指针,如 int (a*)[5]:这就是一个指向含有5个元素的数组的指针 指针数组是一个数组,它包含的元素全是指针变 ...

  6. c语言数组冒泡排序程序的解释,c语言指针数组冒泡排序代码

    在学习计算机编程的时候,最重要的就是多思考多练习,才能理解其中的原理.算法,下面ITmemo分享一段我学习c语言基础之后写的一段c语言指针数组冒泡排序代码,其实就是从常规代码改为指针方式进行数组排序而 ...

  7. c语言指针怎么指向函数,C语言指针---指向函数的指针

    C语言指针-指向函数的指针 1.什么是函数指针 在程序中定义了一个函数,在编译时,系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针. 一般形式: 类型名 (*指 ...

  8. C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数

    C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...

  9. c语言指针数组分配内存,指针数组数组指针的分配内存及函数参数 C语言版

    最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了.所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了<C缺陷和陷阱& ...

  10. 【嵌入式开发】C语言 指针数组 多维数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...

最新文章

  1. spring in action 4 线路图
  2. NES模拟器开发-CPU笔记
  3. python手机软件-Python爬虫:抓取手机APP的数据
  4. Redhat, CentOS 设置系统时区
  5. mkdir,mkdirs区别
  6. pytest的fixture传参数
  7. Linux谁访问这个内存,Linux中的直接内存访问
  8. 关于XML序列化与CultureInfo
  9. Linux的LAMP
  10. 当打开VS2013卡到吐,并且点一下卡一下
  11. read()/write()的生命旅程——前言与目录
  12. 酷派+k1+rom+android+4.4,酷派新品牌怎么样?ivvi K1全面评测
  13. 个人日记-《学习究竟是什么》读后感-2020/6/21
  14. Visual Studio 程序集
  15. 昆石VOS3000_2.1.4.0安装脚本
  16. 2019石油大学西方艺术赏析第二阶段在线作业(答案)
  17. 支付宝商家二维码收款、订单状态查询、退款API试用笔记
  18. 银行业务--资产业务
  19. cl.5fy.php,近期选手转会:Scarlett、Bly离队Cl
  20. 详解诊断数据库ODX-D

热门文章

  1. MySQL数据库学习笔记(2)
  2. android沉浸式状态栏、fitsSystemWindows、标题栏折叠
  3. GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)
  4. 【Android】从无到有:手把手一步步教你自定义RecyclerView手势监听
  5. python 局域网扫描_局域网扫描器(有待优化)-Python应用
  6. 2011年9月30日
  7. Market1501数据集下载
  8. 面试必问之JVM原理 1
  9. Android9.0对非 SDK 接口的限制
  10. 通过ADB命令实现App的安装、卸载、覆盖