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、 指针的概念: 指针是一个变量,它存储的是另一个变量的内存地址,而不是变量的值。 指针变量的声明:在C/C等语言中,我们通过使用星号*来声明一个指针变量。例如,int *ptr; 这行代码声明了一个…...
【讲解下如何解决一些常见的 Composer 错误】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
qq空间:图片批量下载js脚本工具,javascript批量下载图片
qq空间:图片批量下载js脚本工具,javascript批量下载图片 QQ空间很多老照片想下载,但是腾讯没放开,只能一张张下载太麻烦。用前端js写了一个脚本支持批量下载。另外就是空间内的照片会被压缩,过几年再看,个…...
滑动验证码登陆测试编程示例
一、背景及原理 处理登录时的滑动验证码有两个难点,第一个是找到滑块需要移动的距离,第二个是模拟人手工拖动的轨迹。模拟轨迹在要求不是很严的情况下可以用先加速再减速拖动的方法,即路程的前半段加速度为正值,后半段为负值去模…...
爬取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:基于Spring Boot 2.x的一站式前后端分离快速开发平台 摘要 随着信息技术的迅速发展,快速构建高质量、高可靠性的企业级应用成为了迫切需求。XBoot,作为一个基于Spring Boot 2.x的一站式前后端分离快速开发平台,通过整合微信…...
24年最新抖音、视频号0成本挂机,单号每天收益上百,可无限挂
详情介绍 这次给大家带来5月份最新的短视频挂机项目,简单易上手,而且不需要任何投入,经过测试收益非常可观,软件完全免费,特别适合没有时间但是想做副业的家人们...
Day31:单元测试、项目监控、项目部署、项目总结、常见面试题
单元测试 保证独立性。 Assert:断言,一般用来比较是否相等,比如 Assert.assertEquals 在JUnit测试框架中,BeforeClass,Before,After和AfterClass是四个常用的注解,它们的作用如下: …...
Flutter笔记:使用Flutter私有类涉及的授权协议问题
Flutter笔记 使用Flutter私有类涉及的授权协议问题 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.cs…...
面试过程种遇到的面试题收集
文章目录 讲一讲这个项目是干什么的?需求规格说明书有哪些章节?职工部门层级如何显示在一张SQL表上?需求开发用到了哪些技术?HashMap 底层数据结构说一下?介绍一下红黑树?HashMap是线程不安全的,…...
Vue学习:21.mixins混入
在Vue中,mixins(混入)是一种用于分发Vue组件中可复用功能的灵活机制。它们允许你抽取组件中的共享功能,如数据、计算属性、方法、生命周期钩子等,并将其作为单独的模块复用到多个组件中。这种方式有助于保持代码的DRY&…...
上传文件到 linux
一、mac 法一:scp 先进入mac的 Node_exporter文件(要上传的文件)目录下 输入scp -P 端口号 文件名 rootIP:/存放路径 scp -P 22 node_exporter-1.8.0.linux-amd64.tar.gz root192.***.2:/root 法二、 rz mac 安装 lrzsz,然后…...
NEO 学习之session7
文章目录 选项 A:它涉及学习标记数据。 选项 B:它需要预定义的输出标签进行训练。 选项 C:它涉及在未标记的数据中寻找模式和关系。 选项 D:它专注于根据输入-输出对进行预测。 答案:选项 C 描述了无监督学习的本质&am…...
毕业设计uniapp+vue有机农产品商城系统 销售统计图 微信小程序
本人在网上找了一下这方面的数据发现农村中的信心普及率很是低农民们都不是怎么会用手机顶多就是打打电话发发短信,平时不太会上网更不会想到通过网络手段去卖出自己的劳作成果—农产品,这无疑大大浪费了农民的劳动成果和国家资源也大大打击了人们的生产…...
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. 项目目标 (1)了解metabase特点 (2)熟练部署metabase工具 (3)掌握metabase基本使用 2. 项目准备 2.1. 规划节点 主机名 主机IP 节点规划 metabase 10.0.1.141 metabase 2.2. 基础准备 系统镜…...
nacos v2.2.3 docker简单安装使用
nacos v2.2.3 docker简单安装使用 Nacos 官方文档: https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html 控制台: http://127.0.0.1:8848/nacos/ 初始用户名、密码: 账号:nacos 密码:nacos 启动docker…...
java设计模式-生成器模式
文章目录 生成器模式(Builder)1、目的和适用场景2、角色和职责3、实现步骤4、示例15、示例26、优点7、示例场景 生成器模式(Builder) 生成器模式(Builder Pattern)是一种创建型设计模式,它用于…...
《前端面试题》- TypeScript - TypeScript的优/缺点
问题 简述TypeScript的优/缺点 答案 优点 增强了代码的可读性和可维护性包容性,js可以直接改成ts,ts编译报错也可以生成js文件,兼容第三方库,即使不是ts编写的社区活跃,完全支持es6 缺点 增加学习成本增加开发成…...
微服务---feign调用服务
目录 Feign简介 Feign的作用 Feign的使用步骤 引入依赖 具体业务逻辑 配置日志 在其它服务中使用接口 接着上一篇博客,我们讲过了nacos的基础使用,知道它是注册服务用的,接下来我们我们思考如果一个服务需要调用另一个服务的接口信息&…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
