C语言指针,数组,函数

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

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liyinuo2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值