漫谈:C语言 奇葩的指针定义规则

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        C语言的语法很麻拐。

        初学者的一个常见BUG:

int *a,b;

        试图定义两个指针,却得到了一个指针和一个整数。

        当然了,在后面使用的时候编译器会指出错误,从而发现问题。

        但是为什么C语言要这么设计呢?为什么不涉及成言严格的“类型 变量;”的语法结构呢?

        其实C语言这样设计还是有很多优势的,比如一个复杂的结构,一次性定义结构和结构的指针(下面的例子是typedef,语法规则和变量定义是一样的):

typedef struct{} A,*pA;

        这样一次定义了两种类型:结构A和指向结构A的指针。不然就要用两句:

typedef struct{} A;
typedef A* pA;

        好吧,我承认其实这也没省力多少啊。况且,现在所有编程规范都主张,一行只能定义一个变量,所以这个优势真不重要。

        我们还是验证一下*到底怎么用吧。下面的代码测试了指针定义的几种情形:

#include <stdio.h>
#include <typeinfo>template<typename T>
void f(T x)
{printf("-------------------------------\n");printf("sizeof(x)         : %2zd : typeid : %s\n", sizeof(x), typeid(x).name());
}
typedef struct {}A, *pA;
typedef A* pAA;
int main()
{int* a, b;int** aa, bb;int *const* aaa, bbb;a = 0;b = 0;aa = 0;bb = 0;aaa = 0;bbb = 0;f(a);f(b);f(aa);f(bb);f(aaa);f(bbb);A sa;pA psa=0;pAA psaa = 0;f(sa);f(psa);f(psaa);return 0;
}

        这个代码中的模板函数f用来打印参数的长度和类型,因为是模板,适用于任何类型。

        在VS上用x86配置编译,输出:

-------------------------------
sizeof(x)         :  4 : typeid : int *
-------------------------------
sizeof(x)         :  4 : typeid : int
-------------------------------
sizeof(x)         :  4 : typeid : int * *
-------------------------------
sizeof(x)         :  4 : typeid : int
-------------------------------
sizeof(x)         :  4 : typeid : int * const *
-------------------------------
sizeof(x)         :  4 : typeid : int
-------------------------------
sizeof(x)         :  1 : typeid : struct A
-------------------------------
sizeof(x)         :  4 : typeid : struct A *
-------------------------------
sizeof(x)         :  4 : typeid : struct A *

        看得出来,不仅“*”只约束后面那个变量,连“**”和“*const*”都只约束后面那个变量,有没有办法改变?尝试下面的代码:

	(int) *const* aaa, bbb;(int *)const* aaa, bbb;(int *const)* aaa, bbb;(int *const*) aaa, bbb;

        每一行都是无法编译的。括号怎么加都不对(除了放在变量名后面把变量变成函数指针)。

        这些规则记牢就对了。


(这里是结束)

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

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

相关文章

YOLOv9/YOLOv8算法改进【NO.128】 使用ICCV2023超轻量级且高效的动态上采样器( DySample)改进yolov8中的上采样

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 首推…

SpringMVC进阶(过滤器解决中文乱码,处理json以及文件上传下载)

文章目录 1.中文乱码处理1.引出问题1.恢复原来取消掉的属性绑定2.启动服务器&#xff0c;引出问题 2.自定义中文乱码过滤器1.MyCharacterFilter.java2.web.xml配置过滤器&#xff08;这个解决乱码的过滤器放到最前面&#xff09;3.结果展示 3.使用Spring过滤器处理&#xff08;…

创建codereview

创建codereview流程 一、开始创建二、选择分支三、添加细节 一、开始创建 点击codereivew按钮 为新的codereview选择一个工程后点击create review 二、选择分支 选择目标分支和要比对的分支&#xff0c;比如develop 三、添加细节 Add branch后&#xff0c;可以继续Edit …

基于Python的在线学习与推荐系统设计与实现(论文+源码)-kaic

题目&#xff1a;在线学习与推荐系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本在线学习与推荐系统就是在这样的大环境下诞生&#xff0…

Python项目开发实战:怎么基于Keras的深度学习来预测房价

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:深度学习-基于Keras的Python项目开发实战_波士顿房价预测_编程案例实例教程.pdf 一、引言 在当今信息化社会,房价预测已成为金融、房地产及相关领域…

牛客热题:链表中环的入口结点

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;**链表中环的入口结点**题目链接…

Mac shell 环境变量配置

官网上的解释。从 macOS Catalina 开始&#xff0c;Mac 使用 zsh 作为默认登录 Shell 和交互式 Shell。你还可以在较早版本的 macOS 中将 zsh 设置为默认 Shell。 在 Mac 上将 zsh 用作默认 Shell - 官方 Apple 支持 (中国) 用命令查看 echo $SHELL 如果返回/bin/zsh 表示是…

C++中的数据结构与算法

随处可见的红黑树 一般会用到[key,value]。 例如github中这个例子&#xff0c;第一个是访问网站&#xff0c;第二个是访问次数&#xff0c;但是这个不是静态的&#xff0c;这有个动态排序&#xff0c;并且当我们需要让相应的访问次数加1的时候&#xff0c;我们用红黑树查找的时…

Flutter 弃用 WillPopScope 使用 PopScope 替代方法

Flutter 弃用 WillPopScope 使用 PopScope 替代方法 视频 https://youtu.be/u3qdqUvFWiM https://www.bilibili.com/video/BV1aJ4m1n7FZ 前言 原文 https://ducafecat.com/blog/migrating-from-willpopscope-to-popscope-in-flutter 了解如何在 Flutter 3.16 中将弃用的 Wil…

【Mac】Mac安装软件常见问题解决办法

前言 刚开始用Mac系统的小伙伴或者在更新系统版本后运行App的朋友会经常碰到弹窗提示「xxx已损坏&#xff0c;无法打开&#xff0c;您应该将它移到废纸篓」、「打不开xxx&#xff0c;因为Apple无法检查其是否包含恶意软件」、「打不开xxx&#xff0c;因为它来自身份不明的开发…

Github 2024-05-01 开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-01统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目2JavaScript项目2Vue项目1非开发语言项目1Rust项目1MyShell: 即时语音克隆和开发者社区 创建周期:39 天开发语言:P…

C++每日一练——两个数组的交集

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入&#xff1a;nums…

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测(Matlab)

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测&#xff08;Matlab&#xff09; 目录 SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现MFO-CNN…

alsactl 保存音频配置

在root下执行 1、关闭音频通道 amixer cset numid2,ifaceMIXER,namePlayback Path OFF2、保存关闭的音频通道 alsactl store -f /var/lib/alsa/asound.state3、恢复保存关闭的音频配置 alsactl restore -f /var/lib/alsa/asound.state4、打开音频通道 amixer cset numid2,ifac…

设计模式的原则与分类

一、设计模式的原则 1、单一职责原则 一个类只需要负责一种职责即可&#xff0c;一个类发生变化的原因&#xff0c;必然是所负责的职责发生变化 2、接口隔离原则 单一职责原则是接口隔离原则的基础&#xff0c;单一职责原则注重职责的划分&#xff0c;从职责角度进行类和接口…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4--汇编LED驱动程序

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

自定义SpringBoot的starter

案例需求&#xff1a;自定义redis-stater。要求当导入redis坐标时&#xff0c;SpringBoot自动创建Jedis的Bean。 实现步骤&#xff1a; 1、创建redis-spring-boot-autoconfigure模块 2、创建redis-spring-boot-starter模块&#xff0c;依赖redis-spring-boot-autoconfigure的…

4G远程温湿度传感器在农业中的应用—福建蜂窝物联网科技有限公司

解决方案 农业四情监测预警解决方案 农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机&#xff0c;可实时监测基地状况,可以提高监测的效率和准确性&#xff0c;为农业生…

Linux内核--设备驱动(三)总线、设备、驱动模型的探究

目录 一、引言 二、设备驱动模型的实现 ------>2.1、platform总线 ------>2.2、驱动与设备的匹配 ------>2.3、设备的探测 ------>2.4、设备驱动模型的改善 三、设备与驱动的匹配流程 ------>3.1、各级设备的展开 ------>3.2、platform 设备 -----…

【云原生】Docker 实践(一):在 Docker 中部署第一个应用

Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用 1.使用 YUM 方式安装 Docker2.验证 Docker 环境3.在 Docker 中部署第一个应用3.1 小插曲&#xff1a;docker pull 报 missing signature key 错误3.2 重新安装 Nginx 1.使用 YUM 方式安装 Docker…