「C语言」指针数组 数组指针 指针函数 函数指针

相信很多人和我一样,有着这样的恐惧,那就是这四个玩意怎么也分不清,这都是啥啥啥啥呢?今天我们来具体分析一下。其实要具体了解这四个概念,只需要了解符号优先级,并关注最后两字,你就成功了一半。

符号优先级

在一个表达式中可能包含多个不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现运算错误。所以表达式必须按一定的顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。所以请牢牢记住下面三个符号的优先级判断,这对今天理解这四个概念,十分重要!

(内) [ ] >  *

 指针数组

指针数组:一个数组,数组的元素是一个指针!

常用形式:类型 *变量[长度]

int *p1[10];
/*
由于[]的优先级比*更高
p1表示一个10个元素的数组
int* 表示元素是一个指向int的指针
即:p1[0],p1[1]...各自装着一个int指针
*/

指针数组比较容易理解,就是一个数组,里面装的是指针!

 数组指针

数组指针:一个指针,而指针的指向是一个数组!

常用形式:类型  (*变量)[长度]

int (*p2)[10];
/*
由于()的优先级高,所以p2表示是一个指针
指针指向的地址长度为int[10]的大小
即:p2为一个指向int[10]数组的指针
*/

有时候我们也把数组指针成为“行指针”,遇到多维数组的时候经常使用。

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p = (int(*)[4])a;
for(int i=0;i<3;i  ) {for(int j=0;j<4;j  ) {printf("%d\n", *(*(p i) j));     }
}

 指针函数

指针函数:一个函数,函数的返回值是一个指针!

常用形式:返回类型 * 函数名(形参类型 形参名)

int * max(int *a,int *b) {return (*a > *b) ? a : b;
} 

指针函数也比较容易理解,就是返回的是一个指针的函数。

 函数指针

函数指针:一个指针,指针指向的是一个函数!

常用形式:返回类型 (*变量)(形参类型

int (*func) (float, float); 
/*
(*func)表明func是一个指针,指向一个函数
前面int,表示该返回值
后面的两个float表明该函数的两个形参类型
*/

举个例子:

int sum(int a, int b) {    return a   b;}
int main() {    //声明同时初始化函数指针    int (*ptr)(int, int) = sum;    //使用*ptr即可替代sum函数    printf("%d\n", (*ptr)(10, 20));    return 0;}

到这里是不是觉得这一切so easy?那么难度开始提升~

const char *(*f_ptr[10])(int a[], double * b)

请问 f_ptr 是啥?别慌,看上去这行代码很长,但是我们一起来分析一下:

f_ptr 后面跟着 [10] ,由于 [] 的优先级更高,所以 f_ptr 是一个长度为10的数组!我们把 f_ptr[10] 看作为 X ,那么数组里面装的啥呢?

const char *(*X)(int a[], double * b)

观察 X 之前的 * ,所以数组里装的是指针!我们把 (*X) 看作为 Y ,那么这个指针指向的又是什么呢?

const char * Y(int a[], double * b)

仔细观察 Y 前后,就可以发现这是一个函数指针,指针指向的函数返回一个   const char * 的指针,而函数的形参 (int [], double *) 。

综上, f_ptr 是一个长度为10的数组,数组元素为返回 const char * ,参数 (int [], double *) 的函数指针。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring 组件扫描_避免不必要的Spring配置组件扫描

spring 组件扫描我在堆栈溢出中遇到了一个有趣的问题。 Brett Ryan有问题&#xff0c;Spring Security配置被初始化了两次。 当我查看他的代码时&#xff0c;我发现了问题所在。 让我展示显示代码。 他有相当标准的Spring应用程序&#xff08;不使用Spring Boot&#xff09;。…

php滚动到指定位置,JQuery插件:ScrollTo平滑滚动到页面指定位置

ScrollTo是一款基于jQuery的滚动插件&#xff0c;当点击页面的链接时&#xff0c;可以平滑地滚动到页面指定的位置。适用在一些页面内容比较多&#xff0c;页面长度有好几屏的场合&#xff0c;本文以DEMO为示例讲解该插件的应用。查看演示DEMO使用方法1&#xff0d;准备jQuery库…

聚集索引和非聚集索引的区别_武汉无疫情小区居民可在小区内非聚集性个人活动...

3月18日&#xff0c;武汉市新冠肺炎疫情防控指挥部社区疫情防控组发布《关于无疫情小区、村(队)调整管控措施的意见》(下简称《意见》)指出&#xff0c;全市认定的无疫情小区、村(队)可对管控措施作有序调整。 被认定为无疫情小区的&#xff0c;允许居民分批、分时段、分楼栋&a…

C语言 | 指向指针的指针排序

C语言实现用指向指针的指针的方法对5个字符串排序并输出。 解题思路&#xff1a;读者看着道题的时候&#xff0c;首先要知道什么时指针&#xff0c;指向指针的指针应该怎么用&#xff0c;一般在开发中不这样用&#xff0c;读者要看明白&#xff0c;这个很锻炼思维的。C语言源代…

jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表

jooq sql最近&#xff0c;我们已经展示了Java 8和函数式编程将如何为使用jOOQ和Java 8 lambda和Streams进行SQL数据的函数数据转换为Java开发人员带来新的视角。 今天&#xff0c;我们将这一步骤更进一步&#xff0c;将数据转换为JavaFX XYChart.Series以根据数据生成美观的条形…

python 接收邮件服务器地址_Python 用IMAP接收邮件

一、简介IMAP(Internet Message Access Protocol)&#xff0c;这个协议与POP一样&#xff0c;也是从邮件服务器上下载邮件到本机&#xff0c;不过IMAP比POP的功能要更加强大些&#xff0c;IMAP除支持POP所有功能外&#xff0c;还支持以下功能&#xff1a;多个邮件文件夹(收件箱…

流媒体服务器 php,nginx 流媒体服务器 FFmpeg 截图

预备:yum install -y automake autoconf libtool gcc gcc-c1.安装phpyum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc php-devel php-fpm2.安装 nginxyum –y install nginx nginx-devel3.安装FFmpeg安装 Install ffmpeg 等模块yum -y install ffmpe…

C语言应用笔记:C语言typedef关键字及其使用

C 语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称&#xff0c;来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称&#xff0c;就可以在该程序中用自己的…

java不支持发行版本12_主要发行版本后Java开发人员应使用的15种工具

java不支持发行版本12新部署的生存工具包&#xff1a;适用于Java开发人员的工具&#xff0c;这些工具经常将代码部署到生产中&#xff01; Takipi会检测生产中的所有错误&#xff0c;并像发生错误时一样显示变量值 立即部署并获得免费的T恤 新部署的终极生存套件 与在僵尸末…

php get raw,file_get_contents(“php:// input”)或$ HTTP_RAW_POST

慕用2447696file_get_contents(php&#xff1a;// input) - 获取原始POST数据&#xff0c;你需要在编写API时使用它&#xff0c;并且需要XML / JSON / ...输入&#xff0c;这些输入无法通过PHP解码为$ _POST 一些例子&#xff1a;通过邮寄JSON字符串发送function fn(){var js_o…

绑定dictionary 给定关键字不再字典中_对字典嵌套的理解及二级下拉菜单的制作...

大家好&#xff0c;今日我们继续讲解VBA数组与字典解决方案&#xff0c;今日讲解第51讲&#xff1a;对字典嵌套的理解及二级下拉菜单的制作.在讲字典的时候,我反复说明,字典看视非常简单,由于它具有直达性可以省略去我们大量的循环查找代码,所以使用起来要特别留意很多用法和常…

C语言小笔记

C99标准下可以指定结构体的成员初始化。typedef struct{int a;int b; } Test;Test test {.a 10, .b 15};C99标准下可以指定数组下标初始化。int a[5] { [2] 5, 6, [4] 7 };方便的数据打印。打印一个整型值数据&#xff1a;int count 10; printf("count %d\n"…

lua中keyvalue_40行中的持久性KeyValue Server和一个可悲的事实

lua中keyvalue再次出现。..彼得斯撰写了有关Unsafe用法的书面概述 &#xff0c;我将简要介绍一下Java中的低级技术如何通过启用更高级别的抽象或允许Java性能级别来节省开发工作可能很多人都不知道。 我的主要观点是表明&#xff0c;将对象转换为字节&#xff0c;反之亦然是一…

C++基础教程示例详解:C++中的I/O重定向

在C语言中&#xff0c;我们可以使用函数freopen()将现有文件指针重定向到另一个流。freopen()的原型如下FILE * freopen ( const char * filename, const char * mode, FILE * stream );例如&#xff0c;要将stdout重定向为文本文件&#xff0c;我们可以编写freopen ("tex…

租房界的php,php实现出租房数据管理及搜索页面

这篇文章主要为大家详细介绍了php出租房数据管理及搜索页面的相关资料&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下php数据访问例子&#xff1a;租房信息管理&#xff0c;具体内容如下1.数据库建表2. zufangzi.php租房子区域&#xff1a;全选requi…

ln函数怎么看奇偶性_Python中函数的参数应该怎么理解?看完这篇文章情不自禁的想收藏...

前面给大家讲过&#xff0c;函数是一种编程思想&#xff0c;是提高代码重复利用的设计思路&#xff0c;是代码设计更深层次的产物。今天要给大家讲的就是函数的核心&#xff1a;函数的参数基本概念1、函数的参数&#xff1a;是指函数完成某项功能所需要的信息。举个例子&#x…

centos7.4编译mysql5.6,centos7编译安装mysql5.6

1.useradd -s /sbin/nologin -M mysql #新增mysql运行用户2.yum -y install ncurses-devel libaio-devel cmake gcc-c #安装依赖包3.编译&#xff0c;注&#xff1a;重新cmake需要删除CMakeCache.txt文件cmake -DCMAKE_INSTALL_PREFIX/zhonghong/mysql \-DMYSQL_DATADIR/zhong…

面向对象设计思想-C语言

面向对象的三个特征&#xff1a;封装&#xff0c;继承&#xff0c;多态。但是C语言不是面向对象编程语言&#xff0c;所以需要借助一些技巧来实现这三个特征&#xff1a;&#xff08;1&#xff09;C语言没有成员函数&#xff0c;struct只能封装数据&#xff0c;不能封装方法&am…

java iterable_太糟糕了,Java 8没有Iterable.stream()

java iterable这是最近比较有趣的Stack Overflow问题之一&#xff1a; 为什么Iterable不提供stream&#xff08;&#xff09;和parallelStream&#xff08;&#xff09;方法&#xff1f; 最初&#xff0c;直接将Iterable转换为Stream似乎很直观&#xff0c;因为在90&#xff…

three.js加载3d模型_基于WebGL的3D技术在网页中的运用 ThingJS 前端开发

Three.js、ThingJS这些引擎库可以加载3D制作软件的模型&#xff0c;大幅度提高了制作效率&#xff0c;改变WebGL开发困难的局面&#xff0c;让Web开发者享受便捷的3D开发服务。三者的难度对比如下&#xff1a;ThingJS&#xff08;框架&#xff09;< Three.js&#xff08;引擎…