C/C++中的指针*是用来修饰类型还是修饰变量及const和typedef

C/C++指针声明风格解析:*号靠近类型还是变量名? 在C/C++编程中,变量声明是基础而关键的概念,它定义了数据的类型和内存布局。理解声明语法本质,需要掌握声明符与变量名的绑定规则,这直接影响代码的可读性和安全性。从技术价值看,正确的声明风格能避免多变量声明歧义、提升代码一致性,是编写健壮系统软件的基础。在嵌入式开发、操作系统内核等应用场景中,指针声明的书写规范尤为重要。本文围绕指针声明符*的书写位置,对比了靠近类型与靠近变量名两种主流风格,通过实际代码示例分析其优缺点,并强调声明符绑定变量名的核心语法规则,帮助开发者规避常见陷阱,提升代码质量。 阅读详情

一:*的修饰对象

如下代码

int errNumb = 0;
(int*) p2 = &errNumb; //编译错误

再修改为如下:

int errNumb = 0;
int (*p2) = &errNumb;  // 编译通过

上述代码是在vs2022的环境下编译的;

说明*是用来修饰变量的,说明不存在(int*)这种类型;

二:const的修饰对象

于是我们以此来理解

int errNumb = 0;
//int const (*curErr1) = &errNumb;  // 能编译通过
const int (*curErr1) = &errNumb;  //  能编译通过
curErr1 = nullptr;

说明const在int前和后是一样的,指针本身的值(地址)是可以被改变的,但是如下是编译错误的

int errNumb = 0;
//int const (*curErr1) = &errNumb;
const int (*curErr1) = &errNumb;
(*curErr1) = 5; // 编译错误

说明指针指向的内容是不可以改变的;

所以const在const int (*curErr1) = &errNumb中,是用来修饰指针所指向的东西即 (*curErr1),所以也和*所指的提领运算符对应起来了;

如下:

int errNumb = 0;
//int const (* const curErr1) = &errNumb; // 编译错误
const int (* const curErr1) = &errNumb; // 编译错误
curErr1 = nullptr;

(* const curErr1)说明这里的const 已经是用来修饰curErr1这个指针变量本身了;注意const位于*和curErr1之间;所以curErr1指针本身的值不能被改变

三:typedef指针

//typedef char (*pstring);  // 编译通过
typedef (char *) pstring;   // 编译错误,再次证明了*是用来修复变量的

但是却有如下的用法

pstring pps1, pps2; 换种写法就是 char *pps1, *pps2;

说明typedef 定义了(*pstring)作为char类型的别名;而pstring就成了(char *)这种类型的别名,这跟上述第一节讲的没有(int *)这种类型好像是有冲突;但仔细想象,(char *)是我们自己用typedef定义出来的,注意,是我们自己定义出来,所以它(char *)这种类型就存在了;

告别系统迁移蓝屏!用Intel RST驱动搞定11代酷睿装Win11的硬盘识别难题 本文详细介绍了如何通过Intel RST驱动解决11代酷睿处理器在安装Win11时遇到的硬盘识别问题。针对VMD技术导致的系统迁移蓝屏错误,提供了从驱动下载、PE环境创建到驱动注入的完整解决方案,帮助用户顺利完成系统升级或迁移。 阅读详情

相关推荐

AlertManager的使用(邮件和微信告警)

一、AlertManager概述 Prometheus 包含一个报警模块,就是我们的 AlertManager,Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组等,是一款前卫的告警通知系统。 Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertman

weixin_45880055的博客 2万+

C++ 中 char\ 、const char\ 、char\ const、const char\ const 的区别:一篇彻底讲清指针与 const 的组合

fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;是否是否是否声明: X ptrconst 在 * 左侧?指向的内容不可修改指向的内容可以修改const 在 * 右侧?const 在 * 右侧?指针和内容都不可修改指向的内容不可修改指针可修改内容可修改指针不可修改char*内容和指针都可修改这四种声明的本质区别在于。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1225

Cadence Virtuoso实战:3分钟搞定反相器参数化设计(附CDF配置避坑指南)

本文详细介绍了如何在Cadence Virtuoso中利用CDF参数传递功能实现反相器的参数化设计,包括PMOS和NMOS的基础搭建、CDF配置技巧及常见报错解决方案。通过实战案例和避坑指南,帮助工程师快速掌握高效设计方法,提升集成电路设计效率。

weixin_28292761的博客 334

【嵌入式C语言】指针修饰符

CPU与缓存之间的数据传输一样,就比如CPU去访问LCD的一个固定的地址,然后这个地址的内容是不断进行刷新的,屏幕上显示的内容就是不断刷新的。在这个例子中,*p 是不可更改的(即不能通过 p 来改变它所指向的值),但是你可以改变 p 使其指向其他的整数变量。类型的指针,这个指针的指向位置是可以任意变的,内容也是可以修改的,再往左看,多了个。修饰,意思就是,指向的内存地址可以改变,但是只能读取,不能修改!先看const p,这样定义的是p不可变,指向位置是不变的,不能就是。这样的指针类型是可以修改内容的。

weixin_63135906的博客 1174

蛋白组学/磷酸化蛋白组学分析笔记-2

如何校正蛋白丰度?磷酸化组学质谱下机处理。

weixin_43029125的博客 1371

【博客汇总】UV打印机博客汇总

UV平板机博客汇总

Print World的专栏 1739

C/C++ 指针

int * p1;//定义p1为指向整型变量的指针变量char * p2;//定义p2为指向字符变量的指针变量指针变量的类型, 是指针所指向的变量的类型, 而不是自身的类型。因此,指针变量的类型与它所指向变量的类型必须一致{ int *p1;//定义p1应指向一个整型变量p1=&x;//将一个实型变量的地址赋给p1这段代码会报错,p1只能指向整型变量, 不能指向实型和字符型变量。

葱卤山猪的博客 2611

【Hadoop】开发插件安装

前言 Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。 Eclipse的插件机制是轻型软件组件化架构。在客户机平台上,Eclipse使用插件来提供所有的附加功能,例如支持Java...

weixin_44039347的博客 3207

C/C++关键字(sizeof(含内存对齐),typedef,static,const,inline)

sizeof()是 C/C++ 中的一个运算符(不是函数),获取对象或类型以字节为单位的内存大小。它在求值,不会产生运行时开销。sizeof\0sizeof()首先这个联合体的大小得看其中最大成员结构的内存大小,结构体u的大小为12字节,而k是4字节,这个联合体一共是12字节。x和k的内存空间是同一块,k赋值为0后,通过x去访问,它的值还是0。

guaixiaohuo的博客 1924

以高通camera 申请ion内存看dma-buf

1 fd 与ion buffer, file绑定 简单总结就是申请一个buffer,再创建一个dmabuf 结构体然后将,然后将dmabuf中得指针指向buffer,dmabuf 再传递给一个匿名的inode,获取到一个file,这样file和dmabuf绑定起来,也就和buffer关联上。然后再从进程中分配一个空闲的fd,将fd 和file囊绑定。这样就能通过fd 快速查找到buffer。file 是个全系统的,他和进程无关,但是fd 是每个进程都是自己独立的,所以再跨进程传输时只需要保证fd ...

兔兔里个花兔的博客 6444

多模态脑区细分图谱 HCP-MMP v1.0, Glasser et al. 2016 皮层和皮下区域,简写和全称对应关系

人类连接组计划多模态脑区细分图谱(HCP-MMP)提供了对人类大脑皮层区域的非常有用的细分(Glasser et al. 2016a, b)。图谱是多模态的,因为每个区域都是根据四个标准的组合定义的,包括结构(T1加权/T2加权髓鞘含量和皮层厚度图)、静息态功能连接、基于任务的激活和拓扑地形组织。HCP-MMP v1.0图谱包含每个半球180个皮层区域,基于210名参与者的分析。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2619

C++ const指针和typedef

问题描述: 最近开发过程中遇到一个小问题,在此记录一下,场景是使用关键字typedef定义了一个指针类型, 使用const修饰变量属性的时候,结果和预期的不一样;示例代码如下: #include <stdio.h> typedef int* pInt; int main() { int iNum = 1; const int* pNum1 = &iNum; int* const pNum2 = &iNum; // pNum3是什么?和pNum1一样?还是和pNum2一样?

流云落尘 287

小工匠聊架构-分布式场景下的并发幂等性常见的解决方案

Pre 我们来回顾下单体时代 单体时代,应用部署在一台主机上,可以使用JVM级别的锁来控制并发请求 。 随着应用规模的不断扩大,集群化或者微服务化的分布式部署越来越普及,每个应用都是一个单独的JVM应用,所以单体时代的这种处理方式已经无法满足当前架构下的业务需求了。 JVM级别的锁已经无法满足跨进程之间访问控制了,进而演化出来了分布式锁。 分布式锁 能否解决幂等性问题? 分布式锁解决什么问题? 简言之: 解决跨进程间无法共享本地资源的问题 ,解决的是分布式场景下并发访问的问题。 为什么需要确保并发.

小工匠 2万+

const iterator 和 const_iterator的区别

清晰明了 const iterator 和 const_iterator的区别

shylyly_的博客 906

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

typedef的使用详解

typedef的使用详解

weixin_54534636的博客 6502

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用using为指针定义别名为什么会对const属性有影响?

项目在遇到的,指针的别名会在函数签名中把顶层const变成底层const。简化了的代码大概是下面的情况。有人可以解释一下为什么么,以及如果我想继续使用指针的别名要怎么书写这个参数?唉,都是历史债。建议前四点都不看,只看最后一点“真正有用的知识”。

第2学堂-专栏 1027

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++中define、typedef、inline、const和constexpr的区别

constexpr 只能定义编译期常量,⽽ const 可以定义编译期常量,也可以定义运⾏期常量。相较于const,constexpr 可以用于数组大小、模板参数等要求编译期确定的场景。// 运行时和编译期皆可用// 仅编译期可用// 可能编译错误(如果 x 不是编译期常量)// 编译成功C++ 中更推荐使用 const 或 constexpr 替代常量宏,使用 inline或constexpr 替代宏函数。

qq_45927005的博客 1717

如何理解c和c++的复杂类型声明

 如何理解c和c++的复杂类型声明曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明。 我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地理解任何C/C++声明的“右左法则”。 需要强调一下的是,复杂的C/

liuxp_008的专栏 2430

C语言中的typedef和define static和const的用法和不同:

typedef和define: 是给对象起另外的名字,主要为了简化程序和增强可读性,区别如下 (1)原理不同 #define是C语言中定义的语法,是预处理指令,也称作宏定义,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数...

chris__x的博客 840

typedef的用法

typedef的用法 第一、四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然: char *pa, *pb; 也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,

qingtu11的博客 6970

C/C++中typdef用法

C/C++中typedef和类型别名 一些习以为常的基础,偶尔间发现还有未触及的盲区。不懂就要弄懂。 感谢 csxiaoshui大神的文章,自己做了删减并记录了自己的体会。 1. 基本语法和使用场景 1.1 指定一个简单的别名,避免了书写过长的类型名称 在C语言的结构体定义中: struct MyStruct { int data1; char data2; }; struct MySt...

蜗牛、Gray 1042

C/C++中 typedef 的深入理解

大二的时候学数据结构总是用到typedef这个关键字,似乎都很熟练,但是,真的就理解了typedef真正的含义了吗 C++/C是真的博大精深!!!!!! 先把typedef的用法都列出来,看看我们是不是都理解: typedef int BOOL; //就是简单的将int类型去一个别名BOOL //然后我们可以用BOOL来定义一个整型变量:BOOL a = 13; ty...

HWQlet的博客 1007

C/C++中的typedef、#define和const

1、C/C++中的typedef和#define      在C/C++中,我们平时写程序可能经常会用到typedef关键字和#define宏定义命令,在某些情况下使用它们会达到相同的效果,但是它们是有实质性的区别,一个是C/C++的关键字,一个是C/C++的宏定义命令,typedef用来为一个已有的数据类型起一个别名,而#define是用来定义一个宏定义常量。下面谈谈两者在实际使用中应当注意的

zjtx409的专栏 440

【GL001】C/C++总结(一)

这篇文章总结了自己在项目中遇到的C/C++混淆点。

guilin 1713

c/c++ define和typedef

研究问题 宏定义#define与定义别名typedef使用方法define与typedef区别 要点: 宏定义#define为预处理指令在编译处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只在编译已被展开的源程序时才会发现可能的错误并报错。   type...

Howl_1的博客 286

C专家编程精华篇----头疼的C语言声明:const、typedef、define及函数高级声明

**************const有关的变量声明***************** (1)const == read-only const修饰的变量被许多人错误的认为是常量,但是const所修饰的变量应该是只读变量 检验这个结论可以用下面这个方法: const int two = 2; switch(i) { case 1: printf("case 1.\n"); case tw

fengxiaoke_fxk的专栏 1万+
上一篇: 关于动词形变的思考
jenokuya
博客等级 码龄17年 13粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值