当前位置: 首页 > news >正文

漫谈: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;

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

        这些规则记牢就对了。


(这里是结束)

相关文章:

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

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 C语言的语法很麻拐。 初学者的…...

spring boot中一般如何使用线程池

在Spring Boot中&#xff0c;线程池作为并发编程的核心工具&#xff0c;对于提升应用程序性能、优化资源利用和保证系统稳定性具有重要作用。本文将详细阐述如何在Spring Boot中正确使用线程池&#xff0c;包括配置参数、实例化、任务提交、监控及常见问题处理等环节&#xff0…...

Shader 纹理动画和顶点动画

一、内置变量--时间 要实现动画&#xff0c;我们需要把时间添加到计算当中&#xff0c;让画面可以随着时间变化而变化。在Unity Shader提供了如下关于时间的内置变量以便于在shader中访问时间实现各种动态效果。 名称类型描述_Timefloat4t是自该场景加载开始所经过的时间&…...

使用macof发起MAC地址泛洪攻击

使用macof发起MAC地址泛洪攻击 MAC地址泛洪攻击原理&#xff1a; MAC地址泛洪攻击是一种针对交换机的攻击方式&#xff0c;目的是监听同一局域网中用户的通信数据。交换机的工作核心&#xff1a;端口- MAC地址映射表。这张表记录了交换机每个端口和与之相连的主机MAC地址之间…...

力扣:1979. 找出数组的最大公约数(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;返回数组中最大数和最小数的 最大公约数 。 两个数的 最大公约数 是能够被两个数整除的最大正整数。 输入&#xff1a; nums [2,5,6…...

电瓶车充电桩:潜藏的暴利行业,简单入门到月入万元!

近几年来&#xff0c;电瓶车凭借其环保、经济特点已成为居民出行的必备工具之一。而促使电瓶车快速普及的原因之一即是电瓶车充电桩的普及。如果留心观察的话&#xff0c;相信大家都可以看出&#xff0c;国内大部分小区都已安装了充电桩设备&#xff0c;电瓶车充电桩已实现了大…...

mac监听 linux服务器性能可视化(Grafana+Promethus+Node_exporter)

Grafana和promethus(普罗米修斯)的安装和使用 监控系统的Prometheus类似于一个注册中心&#xff0c;我们可以只需要配置一个Prometheus,而在其他服务器&#xff0c;只需要安装node_exporter,它们的数据流转就是通过exporter采集数据信息&#xff0c;然后告诉prometheus它的位置…...

【负载均衡在线OJ项目日记】运行功能开发

目录 前言 运行功能开发分析 获取子进程运行信息 程序运行资源限制 运行功能开发代码 前言 上篇文章我们对客户端服务器传来的临时文件进行编译&#xff0c;这篇文章主要对编译成功的代码在我们的服务器运行这块功能的开发。 运行功能开发分析 在运行功能开发之前我们默…...

Qt | QLineEdit 类(行编辑器)

01、上节回顾 Qt | QComboBox(组合框)02、QLineEdit 1、QLineEdit 类是 QWidget 类的直接子类,该类实现了一个单行的 输入部件,即行编辑器,见右图 2、验证器(QValidator 类)和输入掩码简介:主要作用是验证用户输入的字符是否符合验证器 的要求,即限制对用户的输入,比…...

Mamba结构的Demo源码解读

文章目录 前言一、mamba结构构建辅助函数解读1、dataclass方法解读2、Norm归一化LayerNormRMSNormRMSNorm源码 3、nn.Parameter方法解读 二、mamba原理二、mamba模型构建1、主函数入口源码解读2、Mamba类源码解读 三、ResidualBlock的mamba结构源码解读四、MambaBlock构成Resid…...

金仓面对面 | 人大金仓×安硕信息共话金融信用风险管理数字化转型之道

金仓面对面 在数字化浪潮的推动下&#xff0c;人大金仓携手行业先锋&#xff0c;共同开启一场关于创新与转型的思想盛宴——金仓面对面。这不仅是一场对话&#xff0c;更是一次智慧的火花碰撞&#xff0c;一次行业数字化转型洞察的深度挖掘。 行业精英汇聚&#xff1a;我们荣幸…...

JavaScript值类型与引用类型的区别

值类型&#xff08;原始类型&#xff09; 值类型包括&#xff1a;undefined、null、boolean、number、string、symbol 和 bigint。这些类型的特点是&#xff1a; 存储位置&#xff1a;值类型的数据直接存储在栈&#xff08;Stack&#xff09;中。复制行为&#xff1a;当一个值…...

每日一博 - 闲聊架构设计中的多级缓存设计

文章目录 方法论概述客户端缓存应用层缓存服务层缓存缓存设计的注意事项总结 思维导图戳这里 方法论概述 从客户端到服务层&#xff0c;缓存的应用广泛而重要。通过合理的缓存设计&#xff0c;能够有效地提高系统的性能并降低延迟。 客户端缓存 在客户端层面&#xff0c;浏览…...

轻松实现MySQL集群配置:一主一从与一主多从教程

在数据驱动的时代&#xff0c;数据库的高可用性和负载分散成为了维护在线服务稳定运行的关键。MySQL作为世界上最流行的开源关系型数据库管理系统&#xff0c;其集群配置是任何DBA或开发人员必须掌握的技能之一。本文将为您详细介绍如何轻松配置MySQL的一主一从和一主多从集群&…...

Leetcode刷题-(41~45)-Java

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可以啦…...

【Android】源码解析Activity的结构分析

源码解析Activity的结构分析 目录 1、Activity、View、Window有什么关联&#xff1f;2、Activity的结构构建流程3 源码解析Activity的构成 3.1 Activity的Attach方法3.2 Activity的OnCreate 4、WindowManager与View的关系总结 1、一个Activity对应几个WindowManage&#xff0…...

小猪APP分发:重塑应用分发市场的创新力量

在移动互联网蓬勃发展的今天&#xff0c;应用分发平台作为连接开发者与用户的桥梁&#xff0c;扮演着至关重要的角色。然而&#xff0c;随着市场的饱和&#xff0c;如何在众多平台中脱颖而出&#xff0c;为开发者提供更宽广的舞台&#xff0c;同时确保用户能够便捷、安全地获取…...

区块链 | IPFS 工作原理入门

&#x1f98a;原文&#xff1a;What is the InterPlanetary File System (IPFS), and how does it work? &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 去中心化互联网 尽管万维网是一个全球性的网络&#xff0c;但在数据存储方面&#…...

减速机齿数速算

1.齿轮相关参数 1.1 模数 &#xff0c; 因为 齿数*齿距 Pi*直径 所以&#xff1a;直径/齿数 齿距/PI 模数 国标现行标准&#xff08;截止2024/5&#xff09;是&#xff1a; GB/ 1357-2008 / ISO 54-1996 模数有国标的一个序列标准&#xff1a; 1.2.轴径 轴径的国标是&a…...

2万字长文:海豚调度器(DolphinScheduler)面试题深入了解

目录 海豚调度器的主要功能和特点 海豚调度器与Oozie、Azkaban等调度器相比的优势...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...