第七章 C语言声明详解

无人机蜂群联合指挥作战技术详解 随着人工智能、通信技术、新材料等领域的不断进步,无人机蜂群联合指挥作战技术将迎来更加广阔的发展前景。未来,无人机蜂群将更加智能化、自主化,能够执行更加复杂、精细的作战任务。同时,加强国际合作,共同制定国际规则和标准,将是推动无人机蜂群技术健康发展的重要方向。无人机蜂群技术,是指通过先进的通信技术、自主导航与决策算法,将大量小型、低成本、功能各异的无人机组织成一个高度协同的群体,执行复杂多样的军事任务。2. 通信与数据链:采用高速、低延迟、抗干扰的通信技术,保障群体内无人机间的信息交换。 阅读详情
   人们常说,C语言的声明太复杂了,的确,这也是C语言饱受批评的地方之一。不过,笔者认为,真正要受到批评的不是语言本身,而是那些传播者。传播者们通常都有一个共识:讲述要由浅入深。作为原则,笔者并非要反对它,毕竟笔者对C语言的学习,也经历了相同的过程。但是,由浅入深并不意味着一切从简,以偏盖全。计算机语言不同于数学理论(虽然它的确根植于数学,与数学密不可分),数学理论是一种循序渐进的过程,后面的理论以前面的理论为基础。但C语言归根说底,就是一堆语言规则而已,应该让学习者一开始就全面且详细地了解它,而不是象现在某些教材所做的那样,只说一部分,不说另一部分,以为这就是由浅入深了,实际上这是以偏盖全。

        语言如此,声明作为C语言的一部分更是如此。我们最常见到的对声明的描述是这样的:

存储类别  类型限定词  类型  标识符

这种说明会给人们一种暗示:C语言的声明是静止的、死板的,什么声明都能够以这个为基础,往上一套就OK了。事实真的如此吗?说句心里话,笔者也祈祷事实真的如此,这样世界就简单多了、清静多了。但别忘了,这个世界总是让人事与愿违的。实际上,C的声明的组织形式是以嵌套为基础的,是用嵌套声明组织起来的,并非象上面所述那么死板,存储类说明符一定得放在限定词前面吗?类型说明符一定要紧贴标识符吗?不!C标准从来没有这样说过!下面来看一看C89对声明的形式是如何规定的:

声明:

声明说明符   初始化声明符表opt  [opt的意思是option,可选]

其中声明说明符由以下三项构成:

声明说明符:

存储类说明符  声明说明符opt
类型说明符    声明说明符opt
类型限定符    声明说明符opt

在这里,一个声明说明符可以包含另一个声明说明符,这就是声明的嵌套,这种嵌套贯穿于整个声明之中,今天我们看来一个非常简单的声明,其实就是由多个声明嵌套组成的,例如:

static const int i=10, j=20, k=30;

变量i前面就是声明说明符部分,有三个声明说明符:static const int,static是一个存储类说明符,它属于这种形式:

static 声明说明符

static后面的声明说明符就是const int,const是一个类型限定符,这也是个嵌套,它是由

const 声明说明符

组成,最后的int是一个类型说明符,到这里已经没有嵌套了,int就是最底的一层。对于存储类说明符、类型说明符和类型限定符的排列顺序,C标准并没有规定其顺序,谁嵌套谁都可以。换言之,上面的声明可以写成:

int static const i=10, j=20, k=30;或者const int static i=10, j=20, k=30;

这无所谓,跟原声明是一样的。再举一个有趣的例子:

const int *p;与int const *p;

有些人会对后面一种形式感到困惑,因为他一直以来学习的都是那种死板的形式,因此他无法理解为什么那个const可以放在int的后面。实际上对于标准来说,这是再正常不过的行为了。

上面举的例子是变量的声明,函数的声明也同样道理,例如:

static const int func(void);
......

int main(void)
{
        int static const (*p)(void);
        p=func;
        .........
        return 0;
}

const int static func(void)
{
        .......
        return 0;
}

func的函数原型声明、函数定义跟main内的函数指针p的声明是一样的。但是,笔者并非鼓励大家把声明说明符写得乱七八糟,作为一个良好的风格,应该按照已经习惯约定的方式排列说明符,但懂得其中的原理非常重要。

声明static const int i=10, j=20, k=30;的int后面的部分就是初始化声明符表,这比较容易理解,这个符表实际上也是嵌套的:

初始化声明符表:

初始化声明符
初始化声明符表, 初始化声明符


初始化声明符:

声明符
声明符=初值


        声明符是初始化声明符的主体,现在来讨论一下声明符是如何规定的:

声明符:

指针opt  直接声明符

这里写的指针opt指的是那个指针声明符*,要注意的是,*属于声明符,而不是声明说明符的一部分。

指针opt又包含:

指针:

* 类型限定符表opt
* 类型限定符表opt 指针

在这里有一个常见的问题,就是const int *p;与int * const p的区别,第一个声明的const属于声明说明符,它跟int一起,是用来说明*p这个声明符的,因此const修饰的是p所指向的那个对象,这个对象是const的。而第二个声明的const是声明符的一部分,它修饰的对象是p本身,因此p是const的。

        上面规定的第二条值得注意,这条规定产生了一种指针与const的复杂形式,例如:

const int * const *** const ** const p;(是不是有种想冲向厕所的冲动?)这是一种复杂的声明嵌套,如何解读这种声明?其实只要掌握了它的规律,无论它有多少个const、多少个*都不难解读的,这个内容我将在第九章进行解释。

        剩下的就是直接声明符和类型限定词表的内容:

直接声明符:

标识符
(声明符)
直接声明符[常量表达式opt]
直接声明符(形式参数类型表)
直接声明符(标识符表opt)


类型限定符表:

类型限定符
类型限定符表 类型限定符


        这一章的最后一个内容,是讨论一下typedef,typedef用来声明一个别名,typedef后面的语法,是一个声明。本来笔者以为这里不会产生什么误解的,但结果却出乎意料,产生误解的人不在少数。罪魁祸首又是那些害人的教材。在这些教材中介绍typedef的时候通常会写出如下形式:

typedef int PARA;

这种形式跟#define int PARA几乎一样,如前面几章所述,这些教材的宗旨是由浅入深,但实际做出来的行为却是以偏盖全。的确,这种形式在所有形式中是最简单的,但却没有对typedef进一步解释,使得不少人用#define的思维来看待typedef,把int与PARA分开来看,int是一部分,PARA是另一部分,但实际上根本就不是这么一回事。int与PARA是一个整体!就象int i:声明一样是一个整体声明,只不过int i定义了一个变量,而typedef定义了一个别名。这些人由于持有这种错误的观念,就会无法理解如下一些声明:

typedef int a[10];
typedef void (*p)(void);

他们会以为a[10]是int的别名,(*p)(void)是void的别名,但这样的别名看起来又似乎不是合法的名字,于是陷入困惑之中。实际上,上面的语句把a声明为具有10个int元素的数组的类型别名,p是一种函数指针的类型别名。

虽然在功能上,typedef可以看作一个跟int PARA分离的动作,但语法上typedef属于存储类声明说明符,因此严格来说,typedef int PARA整个是一个完整的声明。


做了一个3DTiles编辑器,支持3DTiles的预览和裁剪导出 3DTiles编辑器的功能极其简洁,核心就是3DTiles格式模型的预览和裁剪。为了演示方便,本文所使用的源数据为mipmap3d[1]网站所提供的无人机拍摄影像,并进行3DTiles构建。打开软件,输入的绝对路径之后,点击添加模型,就可以将模型加载进预览区。之后,点击裁剪模式按钮,默认会出现立方体裁剪框,可通过拖动句柄的方式去调整裁剪框的范围。同时,除了默认的盒体裁切模式外,还支持多边形裁切,点击多边形裁切后,可切换到顶视图,选择重绘多边形,可进行打点绘制。 阅读详情

相关推荐

RTX 4060笔记本也能跑!保姆级教程:用Ollama在Windows上部署DeepSeek-R1-8B模型

本文详细介绍了如何在RTX 4060笔记本上通过Ollama本地部署DeepSeek-R1-8B模型,提供从环境配置到性能调优的全流程优化指南。针对笔记本用户的显存、散热等问题,给出了量化模型选择、启动参数优化及散热解决方案,帮助用户在消费级硬件上高效运行大语言模型。

weixin_28745067的博客 524

C/C++语言中的声明

一般的声明形式如下: 声明说明符+声明符列表 声明说明符:描述声明的变量或函数的性质。         声明说明符分为三大类:         1.存储类型:auto、static、extern、register。每次声明只能出现一个存储类型,并且放在声明语句的最前面。         2.类型限定符:const、volatile、(:C99restrict)。每次声明可以包含零个或多个...

linux驱动开发大纲 1632

东方财富API隐藏技巧:这样获取分时均价线数据更稳定(避坑指南)

本文深入解析东方财富API获取股票分时数据,特别是分时均价线的实战技巧与避坑指南。针对高频调用中常见的请求失败、数据错位及IP限制等问题,提供了从接口参数深层解析、稳健请求与错误处理机制,到系统优化与数据校验的全流程解决方案,帮助开发者构建稳定可靠的数据采集系统。

rice5的博客 2525

《C专家编程》第三章——分析C语言的声明

  前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解。现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其次就是学习怎样对C语言的声明进行分析,另外本文将详细来探讨一个分析C语言声明的工具——cdecl,分析和编写它的源代码。   C语言的声明晦涩难懂这一点应该是名不虚传的,比如说下面这个声明: ...

weixin_30387663的博客 263

概率整形 Peobabilistic Shaping PS 第一节

概率整形概述 概率整形(Peobabilistic Shaping, PS)是一种针对于调制格式的优化技术,它为光通信通信提供了非常高的灵活性,但不会增加系统复杂性。尤其是光通信中的非线性问题会限制功率,使得PS就像为光通信量身定做的一样。 PS技术能够在不增加发送功率的前提下,获得高频谱效率和传输容量。2016年在使用PS技术的实验中实现了6600km单模光纤的65Tbit/s数据的传输。 到目前位置PS技术的研究主要集中在具有相干检测的单载波光纤传输。 概率整形的基本原理 概率整形技术就是通过在编码前

Explore_OuO的博客 8126

DCDC--控制方式(Control Mode)

DCDC反馈控制方式

网始如芯个人博客 1万+

c语言中的指针声明符,C语言中的指针

在复习C语言的过程中,遇到了二维数组的指针表示问题。因此凭借这次机会查阅了相关的资料并进行了部分的代码实验。本篇即是一次个人总结。0x00 指针与地址我们知道,在计算机内存中所有的数据均是线性排布。每个单元都有其唯一的地址与之对应,我们可以理解为一条街所有的房子都有唯一的门牌号。而指针就是门牌号,我们可以通过指针找到内存中任意单元内的值,就好比我们可以通过门牌号找到任意一栋房子。而在这里,我们需要...

weixin_29070721的博客 927

VS2022命令行编译C++报错?一招解决‘fatal error C1034: iostream: 不包括路径集‘

本文针对VS2022命令行编译C++时常见的'fatal error C1034: iostream: 不包括路径集'错误,深入剖析了其根源在于环境变量缺失。文章提供了永久配置用户环境变量(PATH、INCLUDE、LIB)的一劳永逸解决方案,确保在任何终端中都能直接使用cl命令进行编译,并给出了进阶配置与常见错误排查指南。

weixin_29011667的博客 304

【C语言】标识符和关键字

1. 标识符 2. 关键字

Qiuhan_909的博客 1万+

从零构建PEMFC仿真模型:MATLAB/Simulink中的模块化拆解与系统集成

本文详细介绍了如何在MATLAB/Simulink环境中从零构建质子交换膜燃料电池(PEMFC)仿真模型,包括电化学模型、气体供应系统和热管理系统的模块化实现。通过多物理场耦合技巧和系统集成策略,帮助工程师和研究者高效开发PEMFC控制策略,优化性能并实现实时仿真。

weixin_29294975的博客 360

【eclipse】win 10:eclipse 4.9 下载、安装和汉化(支持中英切换)

目录 一、eclipse下载 二、eclipse安装 三、eclipse在线汉化 四、eclipse离线汉化(推荐) 一、eclipse下载 ①官网下载地址(收费):https://www.eclipse.org/downloads/点击前往下载 ②【推荐】我的百度网盘下载地址(包括离线汉化包):点击下载 提取码:0nfw ③eclipse4.9其他地址下载:http...

顾三殇 —— 博客空间(软件测试) 1万+

再再论指针

 再再论指针----篇首语        指针是C语言规范里面一项核心内容,指针具有与生俱来的优势,利用指针可以写出许多短小精悍、效率极高的代码,它是C语言一把无可替代的利器,凭着这把利器,C语言与其它高级语言相比至少在效率方面高人一筹。但是,由于指针的原理与使用方式跟人们通常的思维习惯有较大的差别,造成了指针比C语言其它概念难理解得多,这使得对指针认识不足成为了一种在C程序员中普遍存在的

云,风扬起的地方 1897

10、网络安全工具:Bettercap 与 Web 应用测试工具全解析

本文详细解析了网络安全工具Bettercap及其在中间人攻击和无线攻击中的应用,同时介绍了多种Web应用测试工具,如Amass、Cadaver、Dirb等,并探讨了工具的使用场景、流程、注意事项以及未来发展趋势,为网络安全测试提供了全面的指导。

u0v1w2x3的博客 227

第七章 C语言声明详解

        人们常说,C语言的声明太复杂了,的确,这也是C语言饱受批评的地方之一。不过,笔者认为,真正要受到批评的不是语言本身,而是那些传播者。传播者们通常都有一个共识:讲述要由浅入深。作为原则,笔者并非要反对它,毕竟笔者对C语言的学习,也经历了相同的过程。但是,由浅入深并不意味着一切从简,以偏盖全。计算机语言不同于数学理论(虽然它的确根植于数学,与数学密不可分),数学理论是一种循序渐进的过程

8052

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

第七章 C语言声明详解- -

        人们常说,C语言的声明太复杂了,的确,这也是C语言饱受批评的地方之一。不过,笔者认为,真正要受到批评的不是语言本身,而是那些传播者。传播者们通常都有一个共识:讲述要由浅入深。作为原则,笔者并非要反对它,毕竟笔者对C语言的学习,也经历了相同的过程。但是,由浅入深并不意味着一切从简,以偏盖全。计算机语言不同于数学理论(虽然它的确根植于数学,与数学密不可分),数学理论是一种循序渐进的过程...

weixin_34356555的博客 92

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【第七章】 C语言之牛客网&力扣刷题笔记 【点进来保证让知识充实你一整天】

同学们,新的学期早已开始啦😚~相信大家都想在这学期偷偷地卷”死“同学吧😇大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!✊星光不负赶路人,时光不有心人只要我们以深深地谦卑去忍耐“暗无天日”的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!以下内容干货满满,跟上步伐吧~综上,特辑的第七章呐🍭~让我们大家一同在平凡的生活中奔赴热爱吧~毕竟,“热爱的东西永远不要说放弃”💫如果有错误❌,欢迎指正呀💫httpshttps。...

Dream_Y.ocean的博客 2685

C语言第七章函数声明

函数声明 #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ //函数声明代码放在最前面,这样保证所有函数可以顺利调用其他函数 //函数只要被声明...

zzugsh的博客 1687

第七章 C语言函数_C语言函数声明以及函数原型

C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。 所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。 函数声明的格式非常简单,相当于去掉函数定义中的函数体,并在最后加上分号;,如下所示: dataType functionName( dataType1 param1, dataType2 param2 ... ); 也..

qq_43205256的博客 220

C语言程序设计核心详解 第七章 函数和预编译命令

第七章详细介绍了函数和预编译命令的概念及应用。首先,通过函数定义、调用及例题分析,阐述了函数的基本结构和调用过程,特别是原型声明的重要性。接着,深入探讨了变量的三属性,包括类型、作用范围和存储类别,详细说明了auto、static、register和extern四种存储类别的特点。最后,介绍了预编译命令,特别是宏的定义和使用,帮助读者理解代码预处理阶段的工作机制。

weixin_62613321的博客 952

【C总集篇】第七章 函数

​ C允许函数调用它自己,这种调用过程称为递归(recursion)。递归有时难以捉摸,有时却很方便实用。结束递归是使用递归的难点,因为如果递归代码中没有终止递归的条件测试部分,一个调用自己的函数会无限递归。​ 可以使用循环的地方通常都可以使用递归。有时用循环解决问题比较好,但有时用递归更好。递归方案更简洁,但效率却没有循环高。​ 指针?什么是指针?从根本上看,指针是一个值为内存地址的变量(或数据对象)。​ 正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。

铁匠匠匠的博客 2973

C语言第七章 函数的进阶应用

首先我们先来实现一个函数,这个函数的功能是:判断一个数是否是素数。判断一个数是否是素数的基本思想已经在循环结构的文章里讲过,这里只是把它实现的功能封装成一个函数,所以判断素数的基本思想不再过多赘述,直接给出代码int main()i <= 100;i++)//调用函数,判断i是否是素数return 0;i < num;i++)printf("%d不是素数\n", num);return;printf("%d是素数\n", num);如果运行上面的代码,会发现,编译器报错了这是什么原因呢。

Nightmare1000的博客 1060

从零开始学C语言系列之第七章《指针简介2》

​   另外,程序必须知道储存在指定地址上的数据类型。long 和 float 可能占用相同的存储空间,但是它们储存数字却大相径庭。​   例如,可以把两个整数相乘,但是不能把两个指针相乘。所以,指针实际上是一个新类型,不是整数类型。,在大部分系统内部,该地址由一个无符号整数表示。但是,不要把指针认为是整数类型。​   pc指向的值(*pc)是char 类型。pc本身是什么类型?声明的意思是 pi是一个指针,​   我们描述它的类型是“

铁匠匠匠的博客 1894

从零开始学C语言系列之第七章《函数中返回值》

​ ​  条件表达式的值是n和m中的较小者,该值要被返回给主调函数。虽然这里不要求用圆括号把返回值括起来,但是如果想让程序条理更清楚或统一风格,可以把返回值放在圆括号内。​  关键字 return 后面的表达式的值就是函数的返回值。在该例中,该函数返回的值就是变量 min 的值。​ 变量 min 属于 imin()函数私有,但是 return 语句把 min 的值传回了主调函数。那是否能像写成下面这样。

铁匠匠匠的博客 1884

c语言第七章作业,C语言学习第七章

今天开始学习指针,指针在C语言中具有很重要的地位,按照老师所说,学C学不好指针跟没学一样,可见指针在C语言中的重要地位.废话不多说,首先我们先要知道什么是指针.指针:指针是一个变量,它存储另一个对象的内存地址,如果一个变量存储另一个对象的地址,则称该变量指向这个对象 。换言之指针也是一种变量,只不过和平常变量不同的是指针内存储的是另一个对象在内存中的存储地址.指针内的值是一个十六进制的数值.由于指...

weixin_29343153的博客 318
上一篇: 第六章 “另类”数组
下一篇: 第八章 右左法则----复杂指针解析
小文兄弟
博客等级 码龄17年 28粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值