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的基础使用,知道它是注册服务用的,接下来我们我们思考如果一个服务需要调用另一个服务的接口信息&…...
从C语言到裸机运行:i.MX6ULL 的 GPIO 控制与编译链接过程分析
引言在嵌入式系统开发中,从高级语言到硬件控制的完整链路涉及编译、链接、寄存器配置等多个环节。本文基于 i.MX6ULL 平台,以 C 语言实现 LED 与蜂鸣器控制为例,系统分析 ARM 裸机开发中的编译工具链使用、链接脚本的作用,以及 GP…...
CANdb++ Editor高效使用技巧:5个隐藏功能大幅提升dbc编辑效率
CANdb Editor高效使用技巧:5个隐藏功能大幅提升dbc编辑效率 在汽车电子开发领域,Vector的CANdb Editor堪称dbc文件编辑的行业标准工具。大多数工程师都能熟练使用其基础功能,但真正的高手往往掌握着那些鲜为人知的"秘密武器"。本文…...
别再花钱买云API了!手把手教你用Docker+Ollama在本地免费跑通Strix渗透测试
零成本打造企业级渗透测试环境:DockerOllama本地化实战指南 当安全团队每月收到云服务商五位数的API账单时,当关键测试任务因网络抖动被迫中断时,越来越多的技术决策者开始重新审视渗透测试的基础架构。本文将揭示如何用消费级硬件构建媲美商…...
用MediaPipe和Python做个隔空切水果游戏:从手势骨架提取到简单游戏逻辑实现
用MediaPipe和Python打造体感切水果游戏:从手势识别到游戏逻辑全解析 还记得小时候在街机厅玩《水果忍者》的畅快感吗?现在,我们完全可以用Python和MediaPipe技术,在电脑前通过手势隔空切水果!本文将带你从零开始&…...
AceCommon:Arduino嵌入式零堆分配轻量C++工具库
1. AceCommon 库概述:面向嵌入式 Arduino 的轻量级底层工具集AceCommon 是一个专为资源受限的微控制器平台(尤其是 Arduino 生态)设计的零依赖、低开销 C 工具库。其核心设计哲学是“小而精、无侵入、可复用”。与常见的功能臃肿、依赖繁杂的…...
3大核心步骤打造专属翻译引擎:Zotero PDF Translate高级扩展指南
3大核心步骤打造专属翻译引擎:Zotero PDF Translate高级扩展指南 【免费下载链接】zotero-pdf-translate 支持将PDF、EPub、网页内容、元数据、注释和笔记翻译为目标语言,并且兼容20多种翻译服务。 项目地址: https://gitcode.com/gh_mirrors/zo/zoter…...
开源编解码工具技术选型与实战指南:跨场景应用的H.264解决方案
开源编解码工具技术选型与实战指南:跨场景应用的H.264解决方案 【免费下载链接】openh264 Open Source H.264 Codec 项目地址: https://gitcode.com/gh_mirrors/op/openh264 一、价值定位:为什么开源编解码工具是技术选型的最优解 在视频技术快…...
AIGlasses_for_navigation免配置环境:预置ffmpeg+opencv+torchvision全栈
AIGlasses_for_navigation免配置环境:预置ffmpegopencvtorchvision全栈 1. 引言:让AI视觉开发变得简单 如果你曾经尝试过搭建一个完整的AI视觉处理环境,一定知道那是个多么痛苦的过程:安装CUDA、配置ffmpeg、编译OpenCV、处理各…...
如何用DoubleQoL模组将《工业队长》的游戏效率提升10倍?
如何用DoubleQoL模组将《工业队长》的游戏效率提升10倍? 【免费下载链接】DoubleQoLMod-zh 项目地址: https://gitcode.com/gh_mirrors/do/DoubleQoLMod-zh 还在为《工业队长》中漫长的等待和繁琐的操作而烦恼吗?DoubleQoLMod-zh模组正是为你量身…...
如何突破Windows权限壁垒?系统管理专家的秘密武器
如何突破Windows权限壁垒?系统管理专家的秘密武器 【免费下载链接】NSudo [Deprecated, work in progress alternative: https://github.com/M2Team/NanaRun] Series of System Administration Tools 项目地址: https://gitcode.com/gh_mirrors/ns/NSudo 在W…...
