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
C语言指针,数组,函数相关推荐
- C语言指针(函数指针数组,二级指针)
int (*p[num])( char*,int,int );int (*(*p)[num])(int a); 上一篇博客最后的两个例子的答案分别是:函数指针数组,函数指针数组的指针. 函数指针数组指 ...
- C语言 指针数组和数组指针区别 - C语言零基础入门教程
目录 一.简介 1.数组 2.指针 3.指针和数组区别 二.指针数组和数组指针区别 1.指针数组 2.数组指针 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> ...
- C语言 指针数组 - C语言零基础入门教程
目录 一.简介 1.数组 2.指针 3.指针和数组区别 二.指针数组 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 1.数组 ...
- c语言指针数组 难点总结,C语言指针与数组的难点分析.pdf
C语言指针与数组的难点分析,c语言指针数组,c语言二维数组指针,c语言指针数组初始化,c语言函数指针数组,c语言数组与指针,c语言结构体数组指针,c语言指向数组的指针,c语言字符串数组指针,c语言数组 ...
- C语言指针数组与数组指针的区别
C语言指针数组与数组指针的区别 首先,顾名思义 数组指针是一个指针,是指向一个数组的指针,如 int (a*)[5]:这就是一个指向含有5个元素的数组的指针 指针数组是一个数组,它包含的元素全是指针变 ...
- c语言数组冒泡排序程序的解释,c语言指针数组冒泡排序代码
在学习计算机编程的时候,最重要的就是多思考多练习,才能理解其中的原理.算法,下面ITmemo分享一段我学习c语言基础之后写的一段c语言指针数组冒泡排序代码,其实就是从常规代码改为指针方式进行数组排序而 ...
- c语言指针怎么指向函数,C语言指针---指向函数的指针
C语言指针-指向函数的指针 1.什么是函数指针 在程序中定义了一个函数,在编译时,系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针. 一般形式: 类型名 (*指 ...
- C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数
C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...
- c语言指针数组分配内存,指针数组数组指针的分配内存及函数参数 C语言版
最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了.所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了<C缺陷和陷阱& ...
- 【嵌入式开发】C语言 指针数组 多维数组
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...
最新文章
- spring in action 4 线路图
- NES模拟器开发-CPU笔记
- python手机软件-Python爬虫:抓取手机APP的数据
- Redhat, CentOS 设置系统时区
- mkdir,mkdirs区别
- pytest的fixture传参数
- Linux谁访问这个内存,Linux中的直接内存访问
- 关于XML序列化与CultureInfo
- Linux的LAMP
- 当打开VS2013卡到吐,并且点一下卡一下
- read()/write()的生命旅程——前言与目录
- 酷派+k1+rom+android+4.4,酷派新品牌怎么样?ivvi K1全面评测
- 个人日记-《学习究竟是什么》读后感-2020/6/21
- Visual Studio 程序集
- 昆石VOS3000_2.1.4.0安装脚本
- 2019石油大学西方艺术赏析第二阶段在线作业(答案)
- 支付宝商家二维码收款、订单状态查询、退款API试用笔记
- 银行业务--资产业务
- cl.5fy.php,近期选手转会:Scarlett、Bly离队Cl
- 详解诊断数据库ODX-D
热门文章
- MySQL数据库学习笔记(2)
- android沉浸式状态栏、fitsSystemWindows、标题栏折叠
- GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)
- 【Android】从无到有:手把手一步步教你自定义RecyclerView手势监听
- python 局域网扫描_局域网扫描器(有待优化)-Python应用
- 2011年9月30日
- Market1501数据集下载
- 面试必问之JVM原理 1
- Android9.0对非 SDK 接口的限制
- 通过ADB命令实现App的安装、卸载、覆盖