constnbsp;intnbsp;*pi与intamp;nbs…

2024-08-22 19:18
文章标签 pi nbs intnbsp constnbsp intamp

本文主要是介绍constnbsp;intnbsp;*pi与intamp;nbs…,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此质料是摘要:<<彻底搞定C 指针 >>,自己感觉比较有价值,现与大家分享。

1. const int i 说起

你知道我们声明一个变量时象这样int i ;这个i是可能在它处重新变赋值的。如下:

int i = 0;

 

i = 20;

不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值。之后我的程序在其它任何处都不会再去重新对它赋值。那我又应该怎么办呢?用const 

 

const int ic =20;

 

ic = 40;

 

 

有了const修饰的ic我们不称它为变量,而称符号常量,代表着20这个数。这就是const的作用。ic是不能在它处重新赋新值了。

 

认识了const 作用之后,另外,我们还要知道格式的写法。有两种:

const int ic = 20; int const ic = 20;

它们是完全相同的。这一点我们是要清楚。总之,你务必要记住const 与int哪个写前都不影响语义。有了这个概念后,我们来看这两个家伙:

const int *pi

int const *pi

按你的逻辑看,它们的语义有不同吗?呵呵,你只要记住一点:int const 哪个放前哪个放后都是一样的,就好比const int ic;与int constic;一样。也就是说,它们是相同的。

好了,我们现在已经搞定一个“双包胎”的问题。那么

int *const pi;

与前两个语句又有什么不同呢?我下面就来具体分析它们的格式与语义吧!

2. const int *pi的语义

我先来说说const int *pi是什么作用 (当然int const *pi也是一样的,前面我们说过,它们实际是一样的)。看下面的例子:

 

int i1 = 30;

int i2 = 40;

const int *pi = &i1;

pi = &i2;

i2 = 80;

printf("%d\n",*pi);

 

语义分析:

看出来了没有啊,pi的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi来修改i2的值。这个规则符合我们前面所讲的逻辑吗?当然符合了!

首先const修饰的是整个*pi(注意,我写的是*pi而不是pi)。所以*pi是常量,是不能被赋值的(虽然pi所指的i2是变量,不是常量)。

其次,pi前并没有用const修饰,所以pi是指针变量,能被赋值重新指向另一内存地址的。你可能会疑问:那我又如何用const 来修饰pi呢?其实,你注意到int *const piconst 的位置就大概可以明白了。请记住,通过格式看语义。哈哈,你可能已经看出了规律吧?那下面的一节也就没必要看下去了。不过我还得继续我的战斗!

3. 再看int *const pi

确实,int*const pi与前面的int const *pi会很容易给混淆的。注意:前面一句的const 是写在pi前和*号后的,而不是写在*pi前的。很显然,它是修饰限定pi的。我先让你看例子:

 

int i1 = 30;

int i2 = 40;

int *const pi =&i1;

 

 

i1 = 80;

 

printf("%d", *pi);

 

语义分析:

看了这段代码,你明白了什么?有没有发现pi值是不能重新赋值修改了。它只能永远指向初始化时的内存地址了。相反,这次你可以通过*pi来修改i1的值了。与前一个例子对照一下吧!看以下的两点分析:

1)pi因为有了const 的修饰,所以只是一个指针常量:也就是说pi值是不可修改的(即pi不可以重新指向i2这个变量了)(请看第4行的注释)。

2)整个*pi的前面没有const 的修饰。也就是说,*pi是变量而不是常量,所以我们可以通过*pi来修改它所指内存i1的值(请看第5行的注释)。

总之一句话,这次的pi是一个指向int变量类型数据的指针常量。

我最后总结两句:

1) 如果const 修饰在*pi前,则不能改的是*pi(即不能类似这样:*pi=50;赋值)而不是指pi。

2) 如果const 是直接写在pi前,则pi不能改(即不能类似这样:pi=&i;赋值)。

请你务必先记住这两点,相信你一定不会再被它们给搞糊了。现在再看这两个声明语句int const *pi和int *constpi时,呵呵,你会头昏脑胀还是很轻松惬意?它们各自声明的pi分别能修改什么,不能修改什么?再问问

自己,把你的理解告诉我吧,可以发帖也可以发到我的邮箱(我的邮箱yyf977@163.com)!我一定会答复的。

4.补充三种情况

这里,我再补充以下三种情况。其实只要上面的语义搞清楚了,这三种情况也就已经被包含了。不过作为三种具体的形式,我还是简单提一下吧!

情况一:int *pi指针指向const int i常量的情况

 

const int i1 = 40;

int *pi;

pi = &i1;

 

pi = (int *) &i1;

 

 

情况二:const int *pi指针指向const int i1的情况

 

const int i1=40;

const int * pi;

pi=&i1;

 

情况三:用const int *const pi声明的指针

 

int i;

const int * constpi=&i;

 

 

0

这篇关于constnbsp;intnbsp;*pi与intamp;nbs…的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097161

相关文章

使用Azure Devops Pipeline将Docker应用部署到你的Raspberry Pi上

文章目录 1. 添加树莓派到 Agent Pool1.1 添加pool1.2 添加agent 2. 将树莓派添加到 Deployment Pool2.1 添加pool2.2 添加target 3. 添加编译流水线3.1 添加编译命令3.2 配置触发器 4. 添加发布流水线4.1 添加命令行4.2 配置artifact和触发器 5. 完成 1. 添加树莓派到 Agent Pool

Banana Pi BPI-F3 进迭时空RISC-V架构下,AI融合算力及其软件栈实践

RISC-V架构下,AI融合算力及其软件栈实践 面对未来大模型(LLM)、AIGC等智能化浪潮的挑战,进迭时空在RISC-V方向全面布局,通过精心设计的RISC-V DSA架构以及软硬一体的优化策略,将全力为未来打造高效且易用的AI算力解决方案。目前,进迭时空已经取得了显著的进展,成功推出了第一个版本的智算核(带AI融合算力的智算CPU)以及配套的AI软件栈。 软件栈简介 AI算法部署旨

基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述        基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真。PI控制器是一种经典的线性控制器,它通过将控制量的比例部分和积分部分相结合来实现对系统输出的调节。比例部分用于快速响应偏差,而积分部分则用于消除稳态误差。 2.系统仿真结果 (完整程

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688,功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算,可支持 16 路高清视频实时分析,灵活应对图像、语音、自然语言等场景,可集成于智算服务器、边缘智算盒、工控机、无人机、AIOT等多种类型产品。 Banana

利用raspberry pi搭建typecho笔记(三) typecho nginx sqlite FAQ

前言 这是一个汇总文,用来总结我在整个配置过程中遇到的各种问题.因为我在解决这些问题的过程中发现,typecho被部署在这种需要完全自己配置的平台上的情况是比较少的,相关的资料也比较少,所以我的解决过程比较困难,因此在此之后,想把这些问题和解决方案都整理出来,如果有同样需要的人,可以直接参考,少走弯路.   1.typecho安装过程中提示"对不起,无法连接数据库,请先检查数据库配置再继续进行安

如何在 Raspberry Pi 5 上设置 Raspberry Pi AI Kit

本指南将帮助您在 Raspberry Pi 5 上安装 Raspberry Pi AI Kit。这将使您能够使用 Hailo AI 神经网络加速器运行 rpicam-apps 摄像头演示。 如果您在开始安装人工智能套件之前需要帮助,本指南提供了安装过程的分步图片。 安装人工智能套件:https://www.raspberrypi.com/documentation/accessorie

树莓派(RPI/Raspberry Pi):一款基于ARM的微型电脑主板【为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux】

Raspberry Pi(中文名为“树莓派”,简写为RPi,(或者RasPi / RPI) 是为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux。 随着Windows 10 IoT的发布,我们也将可以用上运行Windows的树莓派。 自问世以来,受众多计算机发烧友和创客的追捧,曾经一“派”难求。别看其外表“娇小”,内“芯”却很强大,视频、音频等功能通通皆有,可谓是“麻雀虽

用Java近似求pi,利用公式pi=4*(1-1/3+1/5-1/7+.....)

public class Welcome { public static void main(String[] args) { // TODO Auto-generated method stub double pi=0; double n=1; double sum=0; double k=1; while((pi-Math.PI)>0.0000001||(Math.PI-pi)>0.00000

linux下无法下载更新软件Couldamp;nbs…

今天更新时候出现了点小问题,一开始更新到一半,我嫌速度慢,就取消掉了。 更新了sources.list之后再执行sudo apt-get update 提示我出错了 E: Could not get lock /var/lib/apt/lists/lock - open (11 Resource temporarily unavailable) E: Unable to lock the lis

基于爬山法MPPT和PI的直驱式永磁同步风力发电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PMSM 4.2 MPPT 4.3 PI 控制器原理 5.完整工程文件 1.课题概述        基于爬山法最大功率点跟踪 (Maximum Power Point Tracking, MPPT) 和比例积分控制器 (Proportional Integral, PI) 的直驱式永磁同