漫谈: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:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 C语言的语法很麻拐。 初学者的…...
spring boot中一般如何使用线程池
在Spring Boot中,线程池作为并发编程的核心工具,对于提升应用程序性能、优化资源利用和保证系统稳定性具有重要作用。本文将详细阐述如何在Spring Boot中正确使用线程池,包括配置参数、实例化、任务提交、监控及常见问题处理等环节࿰…...
Shader 纹理动画和顶点动画
一、内置变量--时间 要实现动画,我们需要把时间添加到计算当中,让画面可以随着时间变化而变化。在Unity Shader提供了如下关于时间的内置变量以便于在shader中访问时间实现各种动态效果。 名称类型描述_Timefloat4t是自该场景加载开始所经过的时间&…...
使用macof发起MAC地址泛洪攻击
使用macof发起MAC地址泛洪攻击 MAC地址泛洪攻击原理: MAC地址泛洪攻击是一种针对交换机的攻击方式,目的是监听同一局域网中用户的通信数据。交换机的工作核心:端口- MAC地址映射表。这张表记录了交换机每个端口和与之相连的主机MAC地址之间…...
力扣:1979. 找出数组的最大公约数(Java)
目录 题目描述:输入:输出:代码实现: 题目描述: 给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数 。 两个数的 最大公约数 是能够被两个数整除的最大正整数。 输入: nums [2,5,6…...
电瓶车充电桩:潜藏的暴利行业,简单入门到月入万元!
近几年来,电瓶车凭借其环保、经济特点已成为居民出行的必备工具之一。而促使电瓶车快速普及的原因之一即是电瓶车充电桩的普及。如果留心观察的话,相信大家都可以看出,国内大部分小区都已安装了充电桩设备,电瓶车充电桩已实现了大…...
mac监听 linux服务器性能可视化(Grafana+Promethus+Node_exporter)
Grafana和promethus(普罗米修斯)的安装和使用 监控系统的Prometheus类似于一个注册中心,我们可以只需要配置一个Prometheus,而在其他服务器,只需要安装node_exporter,它们的数据流转就是通过exporter采集数据信息,然后告诉prometheus它的位置…...
【负载均衡在线OJ项目日记】运行功能开发
目录 前言 运行功能开发分析 获取子进程运行信息 程序运行资源限制 运行功能开发代码 前言 上篇文章我们对客户端服务器传来的临时文件进行编译,这篇文章主要对编译成功的代码在我们的服务器运行这块功能的开发。 运行功能开发分析 在运行功能开发之前我们默…...
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…...
金仓面对面 | 人大金仓×安硕信息共话金融信用风险管理数字化转型之道
金仓面对面 在数字化浪潮的推动下,人大金仓携手行业先锋,共同开启一场关于创新与转型的思想盛宴——金仓面对面。这不仅是一场对话,更是一次智慧的火花碰撞,一次行业数字化转型洞察的深度挖掘。 行业精英汇聚:我们荣幸…...
JavaScript值类型与引用类型的区别
值类型(原始类型) 值类型包括:undefined、null、boolean、number、string、symbol 和 bigint。这些类型的特点是: 存储位置:值类型的数据直接存储在栈(Stack)中。复制行为:当一个值…...
每日一博 - 闲聊架构设计中的多级缓存设计
文章目录 方法论概述客户端缓存应用层缓存服务层缓存缓存设计的注意事项总结 思维导图戳这里 方法论概述 从客户端到服务层,缓存的应用广泛而重要。通过合理的缓存设计,能够有效地提高系统的性能并降低延迟。 客户端缓存 在客户端层面,浏览…...
轻松实现MySQL集群配置:一主一从与一主多从教程
在数据驱动的时代,数据库的高可用性和负载分散成为了维护在线服务稳定运行的关键。MySQL作为世界上最流行的开源关系型数据库管理系统,其集群配置是任何DBA或开发人员必须掌握的技能之一。本文将为您详细介绍如何轻松配置MySQL的一主一从和一主多从集群&…...
Leetcode刷题-(41~45)-Java
算法是码农的基本功,也是各个大厂必考察的重点,让我们一起坚持写题吧。 遇事不决,可问春风,春风不语,即是本心。 我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就可以啦…...
【Android】源码解析Activity的结构分析
源码解析Activity的结构分析 目录 1、Activity、View、Window有什么关联?2、Activity的结构构建流程3 源码解析Activity的构成 3.1 Activity的Attach方法3.2 Activity的OnCreate 4、WindowManager与View的关系总结 1、一个Activity对应几个WindowManage࿰…...
小猪APP分发:重塑应用分发市场的创新力量
在移动互联网蓬勃发展的今天,应用分发平台作为连接开发者与用户的桥梁,扮演着至关重要的角色。然而,随着市场的饱和,如何在众多平台中脱颖而出,为开发者提供更宽广的舞台,同时确保用户能够便捷、安全地获取…...
区块链 | IPFS 工作原理入门
🦊原文:What is the InterPlanetary File System (IPFS), and how does it work? 🦊写在前面:本文属于搬运博客,自己留存学习。 1 去中心化互联网 尽管万维网是一个全球性的网络,但在数据存储方面&#…...
减速机齿数速算
1.齿轮相关参数 1.1 模数 , 因为 齿数*齿距 Pi*直径 所以:直径/齿数 齿距/PI 模数 国标现行标准(截止2024/5)是: GB/ 1357-2008 / ISO 54-1996 模数有国标的一个序列标准: 1.2.轴径 轴径的国标是&a…...
2万字长文:海豚调度器(DolphinScheduler)面试题深入了解
目录 海豚调度器的主要功能和特点 海豚调度器与Oozie、Azkaban等调度器相比的优势...
MyBatis 中 CDATA 的实战应用与避坑指南
1. 为什么MyBatis需要CDATA 在MyBatis的日常开发中,我们经常需要在XML映射文件中编写SQL语句。但XML本身对特殊字符有着严格的限制,比如小于号(<)、大于号(>)、和号(&)等字符在XML中都有特殊含义。这就导致了一个很现实的问题:当我…...
单片机开发三大软件架构对比与实践
单片机开发常用软件架构深度解析1. 项目概述在嵌入式系统开发中,软件架构设计直接影响系统的可靠性、可维护性和实时性。本文系统分析三种主流单片机软件架构方案,包括时间片轮询法、操作系统方案和前后台顺序执行法,为开发者提供架构选型参考…...
做客户管理之前,先看看这 6 个教训
方案 A:传统开发方式分析 传统开发需要组建专业团队,包括产品经理、UI 设计师、前后端开发、测试工程师等。中等规模项目团队 5-8 人,开发周期 3-6 个月,人力成本 30-100 万。开发过程中需求沟通成本高,业务人员用自然…...
OpenDroneMap实战指南:从航拍图像到三维模型的完整技术解析
OpenDroneMap实战指南:从航拍图像到三维模型的完整技术解析 【免费下载链接】ODM A command line toolkit to generate maps, point clouds, 3D models and DEMs from drone, balloon or kite images. 📷 项目地址: https://gitcode.com/gh_mirrors/od…...
ViGEmBus虚拟手柄驱动全栈技术指南:从内核原理到游戏控制革新
ViGEmBus虚拟手柄驱动全栈技术指南:从内核原理到游戏控制革新 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 一、认知虚拟手柄技术:…...
Windows右键菜单终极管理指南:3步告别臃肿,打造高效桌面体验
Windows右键菜单终极管理指南:3步告别臃肿,打造高效桌面体验 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾因Windows右键菜单过…...
nanomsg性能基准测试终极指南:不同消息大小下的吞吐量对比分析
nanomsg性能基准测试终极指南:不同消息大小下的吞吐量对比分析 【免费下载链接】nanomsg nanomsg library 项目地址: https://gitcode.com/gh_mirrors/na/nanomsg nanomsg是一个轻量级、高性能的消息传递库,专为解决常见的通信模式而设计。作为na…...
HertzBeat与Prometheus兼容性详解:平滑迁移和生态整合终极指南
HertzBeat与Prometheus兼容性详解:平滑迁移和生态整合终极指南 Apache HertzBeat是一款功能强大的开源实时监控系统,与Prometheus生态系统完美兼容,提供无代理、高性能集群和自定义监控功能。🚀 作为新一代监控工具,H…...
FSCalendar终极指南:打造完美iOS日历体验的完整教程
FSCalendar终极指南:打造完美iOS日历体验的完整教程 【免费下载链接】FSCalendar A fully customizable iOS calendar library, compatible with Objective-C and Swift 项目地址: https://gitcode.com/gh_mirrors/fs/FSCalendar FSCalendar是一款功能强大且…...
CLIP-GmP-ViT-L-14入门指南:ViT-L-14主干网络结构与特征提取流程
CLIP-GmP-ViT-L-14入门指南:ViT-L-14主干网络结构与特征提取流程 1. 项目概述 CLIP-GmP-ViT-L-14是一个经过几何参数化(GmP)微调的CLIP模型,在ImageNet和ObjectNet数据集上能达到约90%的准确率。这个模型基于ViT-L-14(Vision Transformer Large 14)主干…...
