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

C/C++的指针、万能指针、常量指针和指针常量

C/C++的指针

1、 指针的概念:

指针是一个变量,它存储的是另一个变量的内存地址,而不是变量的值。
指针变量的声明:在C/C++等语言中,我们通过使用星号*来声明一个指针变量。例如,int *ptr; 这行代码声明了一个名为ptr的指针变量,它指向一个整数类型的内存地址。
指针变量的赋值:我们需要将一个变量的地址赋值给指针变量。这可以通过使用取地址运算符&来实现。例如,int x = 10; ptr = &x; 这段代码将变量x的地址赋值给了指针变量ptr。
接下来,我们详细讲解指针变量的定义和使用:

2、指针变量的定义和使用

定义指针变量

在C/C++中,我们可以这样定义一个指针变量:

// 定义一个指向整数的指针变量  
int *ptr;  // 定义一个指向字符的指针变量(通常用于字符串)  
char *str;  // 定义一个指向浮点数的指针变量  
float *fptr;

使用指针变量

使用指针变量主要包括以下几个步骤:

初始化指针:在将指针用于访问或修改数据之前,必须确保它指向了一个有效的内存地址。这可以通过将某个变量的地址赋值给指针来实现。

int x = 10;  
int *ptr = &x;  // ptr现在指向变量x的内存地址

通过指针访问数据:一旦指针指向了一个有效的内存地址,我们就可以通过解引用指针(使用星号*)来访问或修改该地址中的数据。

// 通过指针访问x的值  
printf("Value of x: %d\n", *ptr);  // 输出: Value of x: 10  // 通过指针修改x的值  
*ptr = 20;  
printf("Value of x after modification: %d\n", x);  // 输出: Value of x after modification: 20

指针的运算:指针可以进行一些基本的算术运算,如加法、减法,但这些运算的结果是基于指针所指向的数据类型的大小来计算的。

// 假设int类型占4个字节  
int arr[5] = {1, 2, 3, 4, 5};  
int *p = arr;  // p指向arr的第一个元素  // p + 1将指向arr的第二个元素  
printf("Value at p + 1: %d\n", *(p + 1));  // 输出: Value at p + 1: 2

空指针和野指针:空指针(NULL)是一个特殊的指针值,它不指向任何有效的内存地址。野指针是指已经被释放或从未被初始化的指针,它们指向的内存地址是不确定的,使用它们可能导致程序崩溃或数据损坏。因此,在使用指针之前,一定要确保它指向了一个有效的内存地址。
动态内存分配:除了使用已经存在的变量地址外,我们还可以使用如malloc、calloc、realloc等函数来动态地分配内存,并将返回的地址赋值给指针。这种方式可以让我们在运行时根据需要分配或释放内存。

3、void*万能指针

void* 是一种通用指针类型,它允许你存储任何数据类型的地址,但是你不能直接通过 void* 类型的指针来访问或修改它所指向的数据,因为编译器不知道这个地址处的数据是什么类型。

当你需要将 void* 指针转换为其他类型的指针以进行解引用或操作时,你需要进行显式的类型转换(也称为强制类型转换)。在 C/C++ 中,这通常使用类型转换运算符(如 (int*)、(char*) 等)来完成。

下面是一个简单的例子,展示如何使用 void* 指针并在需要时将其转换为其他类型的指针:

#include <stdio.h>  
#include <stdlib.h>  void print_int(void* ptr) {  // 将 void* 转换为 int*  int* int_ptr = (int*)ptr;  // 现在可以安全地解引用 int_ptr  printf("The value is: %d\n", *int_ptr);  
}  int main() {  int x = 42;  // 将 int 变量的地址传递给 void* 类型的函数  print_int(&x);  return 0;  
}

在这个例子中,print_int 函数接受一个 void* 类型的参数,并在函数内部将其转换为 int* 类型的指针,然后解引用该指针以打印整数的值。

注意,虽然 void* 提供了灵活性,但使用它时也需要谨慎,因为它可能隐藏类型错误,导致程序在运行时出现错误。在使用 void* 时,最好确保你明确知道指针所指向的数据类型,并在使用前进行正确的类型转换。

4、常量指针和指针常量的概念

*const (号)左边放,是指针变量指向常量 - 常量指针

指的是当const关键字出现在指针声明中的星号*左边时,该指针是一个指向常量的指针,即你不能通过这个指针去修改它所指向的数据,但你可以改变这个指针指向的地址。例如:

const int *p; // p 是一个指向 int 类型常量的指针

在这个例子中,p 是一个指针,它可以指向一个 int 类型的变量,但是你不能通过 p 来修改那个变量的值(因为它是常量的)。但是,你可以让 p 指向另一个地址。

*const (号)右边放,是指针常量指向变量 - 指针常量

指的是当const关键字出现在指针声明中的星号*右边时,该指针是一个指针常量,即你不能改变这个指针指向的地址,但你可以通过这个指针去修改它所指向的数据。例如:

int *const q; // q 是一个指向 int 类型变量的指针常量

在这个例子中,q 是一个指针常量,你不能改变 q 指向的地址,但是你可以通过 q 来修改它所指向的 int 类型的变量的值。

*const (号)两边放,是指针常量指向常量 - 常量指针常量

指的是当const关键字在指针声明中既出现在星号左边又出现在星号右边时,该指针是一个指向常量的指针常量,即你不能改变这个指针指向的地址,也不能通过这个指针去修改它所指向的数据。例如:

const int *const r; // r 是一个指向 int 类型常量的指针常量

在这个例子中,r 是一个指针常量,你不能改变 r 指向的地址。同时,r 指向的是一个常量,所以你也不能通过 r 来修改它所指向的 int 类型的变量的值。

总结

相关文章:

C/C++的指针、万能指针、常量指针和指针常量

C/C的指针 1、 指针的概念&#xff1a; 指针是一个变量&#xff0c;它存储的是另一个变量的内存地址&#xff0c;而不是变量的值。 指针变量的声明&#xff1a;在C/C等语言中&#xff0c;我们通过使用星号*来声明一个指针变量。例如&#xff0c;int *ptr; 这行代码声明了一个…...

【讲解下如何解决一些常见的 Composer 错误】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

qq空间:图片批量下载js脚本工具,javascript批量下载图片

qq空间&#xff1a;图片批量下载js脚本工具&#xff0c;javascript批量下载图片 QQ空间很多老照片想下载&#xff0c;但是腾讯没放开&#xff0c;只能一张张下载太麻烦。用前端js写了一个脚本支持批量下载。另外就是空间内的照片会被压缩&#xff0c;过几年再看&#xff0c;个…...

滑动验证码登陆测试编程示例

一、背景及原理 处理登录时的滑动验证码有两个难点&#xff0c;第一个是找到滑块需要移动的距离&#xff0c;第二个是模拟人手工拖动的轨迹。模拟轨迹在要求不是很严的情况下可以用先加速再减速拖动的方法&#xff0c;即路程的前半段加速度为正值&#xff0c;后半段为负值去模…...

爬取89ip代理、 爬取豆瓣电影

1 爬取89ip代理 2 爬取豆瓣电影 1 爬取89ip代理 import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup from requests.exceptions import ProxyErrorclass SpiderIP:def __init__(self):# 定义目标地址哦self.tag_url "https://www.89i…...

XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台

XBoot&#xff1a;基于Spring Boot 2.x的一站式前后端分离快速开发平台 摘要 随着信息技术的迅速发展&#xff0c;快速构建高质量、高可靠性的企业级应用成为了迫切需求。XBoot&#xff0c;作为一个基于Spring Boot 2.x的一站式前后端分离快速开发平台&#xff0c;通过整合微信…...

24年最新抖音、视频号0成本挂机,单号每天收益上百,可无限挂

详情介绍 这次给大家带来5月份最新的短视频挂机项目&#xff0c;简单易上手&#xff0c;而且不需要任何投入&#xff0c;经过测试收益非常可观&#xff0c;软件完全免费&#xff0c;特别适合没有时间但是想做副业的家人们...

Day31:单元测试、项目监控、项目部署、项目总结、常见面试题

单元测试 保证独立性。 Assert&#xff1a;断言&#xff0c;一般用来比较是否相等&#xff0c;比如 Assert.assertEquals 在JUnit测试框架中&#xff0c;BeforeClass&#xff0c;Before&#xff0c;After和AfterClass是四个常用的注解&#xff0c;它们的作用如下&#xff1a; …...

Flutter笔记:使用Flutter私有类涉及的授权协议问题

Flutter笔记 使用Flutter私有类涉及的授权协议问题 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.cs…...

面试过程种遇到的面试题收集

文章目录 讲一讲这个项目是干什么的&#xff1f;需求规格说明书有哪些章节&#xff1f;职工部门层级如何显示在一张SQL表上&#xff1f;需求开发用到了哪些技术&#xff1f;HashMap 底层数据结构说一下&#xff1f;介绍一下红黑树&#xff1f;HashMap是线程不安全的&#xff0c…...

Vue学习:21.mixins混入

在Vue中&#xff0c;mixins&#xff08;混入&#xff09;是一种用于分发Vue组件中可复用功能的灵活机制。它们允许你抽取组件中的共享功能&#xff0c;如数据、计算属性、方法、生命周期钩子等&#xff0c;并将其作为单独的模块复用到多个组件中。这种方式有助于保持代码的DRY&…...

上传文件到 linux

一、mac 法一&#xff1a;scp 先进入mac的 Node_exporter文件&#xff08;要上传的文件&#xff09;目录下 输入scp -P 端口号 文件名 rootIP:/存放路径 scp -P 22 node_exporter-1.8.0.linux-amd64.tar.gz root192.***.2:/root 法二、 rz mac 安装 lrzsz&#xff0c;然后…...

NEO 学习之session7

文章目录 选项 A&#xff1a;它涉及学习标记数据。 选项 B&#xff1a;它需要预定义的输出标签进行训练。 选项 C&#xff1a;它涉及在未标记的数据中寻找模式和关系。 选项 D&#xff1a;它专注于根据输入-输出对进行预测。 答案&#xff1a;选项 C 描述了无监督学习的本质&am…...

毕业设计uniapp+vue有机农产品商城系统 销售统计图 微信小程序

本人在网上找了一下这方面的数据发现农村中的信心普及率很是低农民们都不是怎么会用手机顶多就是打打电话发发短信&#xff0c;平时不太会上网更不会想到通过网络手段去卖出自己的劳作成果—农产品&#xff0c;这无疑大大浪费了农民的劳动成果和国家资源也大大打击了人们的生产…...

php使用Canal监听msyql

canal需要java8 去官网下载java8 安装JAVA #创建目录 mkdir -p /usr/local/java/ #解压到目录 tar zxvf jdk-8u411-linux-x64.tar.gz -C /usr/local/java/配置环境变量在 /etc/profile 最后加入 export JAVA_HOME/usr/local/java/jdk1.8.0_411 export CLASSPATH.:$JAVA_HOM…...

metabase部署与实践

1. 项目目标 &#xff08;1&#xff09;了解metabase特点 &#xff08;2&#xff09;熟练部署metabase工具 &#xff08;3&#xff09;掌握metabase基本使用 2. 项目准备 2.1. 规划节点 主机名 主机IP 节点规划 metabase 10.0.1.141 metabase 2.2. 基础准备 系统镜…...

nacos v2.2.3 docker简单安装使用

nacos v2.2.3 docker简单安装使用 Nacos 官方文档&#xff1a; https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html 控制台&#xff1a; http://127.0.0.1:8848/nacos/ 初始用户名、密码&#xff1a; 账号&#xff1a;nacos 密码&#xff1a;nacos 启动docker…...

java设计模式-生成器模式

文章目录 生成器模式&#xff08;Builder&#xff09;1、目的和适用场景2、角色和职责3、实现步骤4、示例15、示例26、优点7、示例场景 生成器模式&#xff08;Builder&#xff09; 生成器模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它用于…...

《前端面试题》- TypeScript - TypeScript的优/缺点

问题 简述TypeScript的优/缺点 答案 优点 增强了代码的可读性和可维护性包容性&#xff0c;js可以直接改成ts&#xff0c;ts编译报错也可以生成js文件&#xff0c;兼容第三方库&#xff0c;即使不是ts编写的社区活跃&#xff0c;完全支持es6 缺点 增加学习成本增加开发成…...

微服务---feign调用服务

目录 Feign简介 Feign的作用 Feign的使用步骤 引入依赖 具体业务逻辑 配置日志 在其它服务中使用接口 接着上一篇博客&#xff0c;我们讲过了nacos的基础使用&#xff0c;知道它是注册服务用的&#xff0c;接下来我们我们思考如果一个服务需要调用另一个服务的接口信息&…...

刷题笔记 - 滑动窗口

文章目录 滑动窗口最长无重复子串最小覆盖子串串联所有单词的子串长度最小的子数组滑动窗口最大值字符串的排列最小区间 滑动窗口 所有题目来自leetcode的回答&#xff1a;https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/3982/hua-d…...

Docker搭建LNMP+Wordpress的实验

目录 一、项目的介绍 1、项目需求 2、服务器环境 3、任务需求 二、Linux系统基础镜像 三、部署Nginx 1、建立工作目录 2、编写Dockerfile 3、准备nginx.conf配置文件 4、设置自定义网段和创建镜像和容器 5、启动镜像容器 6、验证nginx 三、Mysql 1、建立工作目录…...

使用Python Pandas实现两表对应列相加(即使表头不同)

目录 引言 Pandas库简介 实现对应列相加 步骤一&#xff1a;加载数据 步骤二&#xff1a;重命名列 步骤三&#xff1a;对应列相加 步骤四&#xff1a;保存结果 案例分析 结论 引言 在数据分析和处理的日常工作中&#xff0c;我们经常会遇到需要将来自不同数据源的数据…...

Linux 虚拟主机切换php版本及参数

我使用的Hostease的Linux虚拟主机产品,由于网站程序需要支持高版本的PHP,程序已经上传到主机&#xff0c;但是没有找到切换PHP以及查看PHP有哪些版本的位置&#xff0c;因此咨询了Hostease的技术支持&#xff0c;寻求帮助了解到可以实现在cPanel面板上找到此切换PHP版本的按钮&…...

Content-Type详解

...

GaussDB数据库SQL系列-复合查询

目录 一、前言 二、复合查询基础 三、实际应用示例 1、使用UNION合并查询结果 2、使用INTERSECT找出共同元素 3、使用EXCEPT排除特定结果 四、高级技巧 1、子查询实例 2、JOIN的应用 五、总结 一、前言 GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;具…...

【Unity】修改模型透明度

在 Unity 中修改模型透明度主要有两种方法&#xff1a;通过材质和通过着色器。以下是两种方法的步骤和解释&#xff1a; 方法 1&#xff1a;通过材质 在 Unity 编辑器中&#xff0c;选择你想要修改透明度的模型。在 Inspector 窗口中&#xff0c;找到模型的 Renderer 组件&am…...

第五篇:通信脉络:探索计算机外设与总线体系的精髓

通信脉络&#xff1a;探索计算机外设与总线体系的精髓 1 引言 在这个技术日新月异的时代&#xff0c;理解计算机系统的基本构成要素 —— 总线和外设 —— 对于每个从事技术工作的人来说都是至关重要的。这些组件不仅是计算机通信的基石&#xff0c;也直接影响着系统的性能、效…...

24.5.5(离散化+树状数组,线段树)

星期一&#xff1a; dp题单 背包 第四题 混可乐 cf传送门 思路&#xff1a;条件可演化为每种可乐值为 ai-n&#xff0c;选最少的可乐使总和为0&#xff08;具体可看官方题解 到这会发现背包并不适合了&#xff0c;其实这是道bfs伪装的背包…...

C语言 | Leetcode C语言题解之第69题x的平方根

题目&#xff1a; 题解&#xff1a; int mySqrt(int x) {long int i 0;for(i0;;i){long int a i*i;long int b (i1)*(i1);if(a < x&&b > x){break;}}return i; }...

南充网站建设价格/搜索引擎营销sem

select * from (select * from NA_USEPERCENTPERDAY t order by t.id) where rownum<8;...

空调网站模板/乔拓云智能建站官网

http://bbs.w3china.org/blog/more.asp?namehongrui&id24192&commentid62227 本文参考了blogjava的文章&#xff0c;做了一定的修改。 1.如何获得当前文件路径 常用&#xff1a; (1).Test.class.getResource("") 得到的是当前类FileTest.class文件的URI目录…...

预约做港澳证的网站/网站设计软件

string有一个方法&#xff0c;就是Join&#xff0c;可以把阵列转换为字符串&#xff1a;下面是Join方法重载&#xff0c;可以指定那个元素开始&#xff0c;连续取几个元素&#xff1a;可以传入一个IEnumerable<T>参数&#xff1a;转载于:https://www.cnblogs.com/insus/p…...

wordpress仿堆糖/搜索引擎优化是做什么

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 据好好先森爆料&#xff1a;一个站长有60多个客户站&#xff0c;说没就没了&#xff0c;损失惨重。60个域名&#xff0c;全部被禁止解析和转移、而且阿里云帐号被冻结&#xff0c;其中一个域名指向…...

pc开奖网站开发/广州seo优化排名公司

有多种方法使用 ADO.NET 调用存储过程并获得返回值和返回参数&#xff0c;其中包括&#xff1a; •使用 DataSet 对象&#xff0c;在获得返回值和返回参数之外&#xff0c;还可以收集并使用返回的数据行。•使用 DataReader 对象收集返回的行&#xff0c;遍历这些行&#xff0c…...

怎么做关注网站/网站流量统计系统

一、创建ln -s 源文件 目标文件 当我们需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;我们不需要在每一个需要的目录下都放一个必须相同的文件&#xff0c;我们只要在某个固定的目录&#xff0c;放上该文件&#xff0c;然后在其它的目录下用ln命令链接&#xff08;…...