「C/C++」C/C++ 之 指针详解

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

      • C++ 指针详解
        • 一、指针的基本概念
        • 二、指针的定义
        • 三、指针的使用
        • 四、指针的运算
        • 五、动态内存分配
        • 六、指针与数组
        • 七、指针与函数
        • 八、注意事项
        • 结语

C++ 指针详解

C++是一种功能强大的编程语言,广泛应用于系统/应用软件、游戏开发、嵌入式系统等多个领域。在C++编程中,指针是一个非常重要的概念,它允许程序直接访问和操作内存地址。本文将详细介绍C++指针的基本概念、定义、使用、运算、动态内存分配以及相关的注意事项。

一、指针的基本概念

指针是C++中的一个变量类型,它存储的是内存地址,而不是数据值本身。指针变量用于指向内存中的某个位置,通过指针可以间接地访问或修改该位置的数据。

二、指针的定义

在C++中,指针的定义通过类型前缀*来表示。例如,定义一个指向整数的指针变量p的语法如下:

int *p;

这里,p是一个指针变量,它指向一个整数类型的内存地址。

三、指针的使用
  1. 赋值:指针变量可以通过赋值操作指向某个变量的地址。使用&运算符获取变量的地址,并将该地址赋值给指针变量。
int a = 10;
int *p = &a; // p指向a的地址
  1. 解引用:通过指针访问它所指向的内存位置的数据,称为解引用。使用*运算符进行解引用操作。
int value = *p; // value的值为10,即a的值
  1. 空指针:未指向任何有效内存地址的指针称为空指针。通常将空指针初始化为nullptr(C++11及以后版本)或NULL(C++98及以前版本,但建议使用nullptr)。
int *p = nullptr; // p是一个空指针
四、指针的运算

指针可以进行一些基本的算术运算,如加减运算和比较运算。

  1. 加减运算:指针的加减运算实际上是对指针所指向的内存地址进行加减操作。加减的数值通常是以指针类型的大小为单位的。
int *p = &a; // 假设a的地址为1000
int *q = p + 1; // q指向a之后的下一个整数位置,地址为1004(假设整数大小为4字节)
  1. 比较运算:可以比较两个指针是否相等,或者一个指针是否大于或小于另一个指针。这种比较是基于指针所指向的内存地址的。
if (p == q) { // 比较p和q是否指向同一个地址// ...
}
五、动态内存分配

在C++中,可以使用newdelete运算符进行动态内存分配和释放。动态内存分配允许在程序运行时根据需要分配内存。

  1. 分配内存:使用new运算符分配内存,并返回指向该内存的指针。
int *p = new int; // 分配一个整数大小的内存,并返回指向它的指针
*p = 10; // 通过指针给分配的内存赋值
  1. 释放内存:使用delete运算符释放之前分配的内存。释放内存后,指针将变为悬空指针(指向已释放的内存),应避免继续使用。
delete p; // 释放p指向的内存
p = nullptr; // 将p设置为空指针,避免悬空指针问题

对于数组和对象,使用new[]delete[]进行动态内存分配和释放。

六、指针与数组

在C++中,数组名实际上是一个指向数组第一个元素的常量指针。因此,可以使用指针来遍历数组。

int arr[] = {1, 2, 3, 4, 5};
int *p = arr; // p指向arr的第一个元素
for (int i = 0; i < 5; ++i) {std::cout << *(p + i) << std::endl; // 通过指针遍历数组
}
七、指针与函数
  1. 指针作为函数参数:可以将指针作为函数参数传递,以修改调用者的变量或传递大型数据结构。
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}
  1. 指针作为函数返回值:函数可以返回指针,以返回动态分配的内存或指向特定数据的指针。
int* createArray(int size) {return new int[size]; // 返回指向动态分配数组的指针
}
八、注意事项
  1. 悬空指针:释放内存后,应将指针设置为nullptr,以避免悬空指针问题。
  2. 野指针:未初始化或未正确赋值的指针可能导致野指针问题,应始终确保指针指向有效的内存地址。
  3. 内存泄漏:忘记释放动态分配的内存会导致内存泄漏,应使用智能指针(如std::unique_ptrstd::shared_ptr)来管理动态内存。
结语

C++指针是编程中的一个重要概念,它允许程序直接访问和操作内存地址。通过合理使用指针,可以实现高效的内存管理和数据访问。然而,指针也带来了一些复杂性和风险,如悬空指针、野指针和内存泄漏等问题。因此,在使用指针时,应谨慎小心,并遵循最佳实践来确保程序的正确性和安全性。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS--导航栏案例

利用CSS制作北大官网导航栏 详细代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}#menu{background-color: darkred;width: 100%;height: 50px…

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割&#xff01; 【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割&#xff01; 文章目录 【语义分割|代码解析】CMTFNet-2: …

基于 Python 的 Django 框架开发的电影推荐系统

项目简介&#xff1a;本项目是基于 Python 的 Django 框架开发的电影推荐系统&#xff0c;主要功能包括&#xff1a; 电影信息爬取&#xff1a;获取并更新电影数据。数据展示&#xff1a;提供电影数据的列表展示。推荐系统&#xff1a;基于协同过滤算法实现个性化推荐。用户系…

Spring Boot 集成 RocketMQ

在现代分布式系统中&#xff0c;消息队列扮演着至关重要的角色。它能够实现系统间的异步通信、解耦组件以及提高系统的可扩展性和可靠性。RocketMQ 作为一款高性能、分布式的消息中间件&#xff0c;被广泛应用于各种大规模系统中。而 Spring Boot 作为一种流行的 Java 开发框架…

Window系统性能调优

1. 系统设置优化 性能选项调整&#xff1a; 右键点击“此电脑” > “属性” > “高级系统设置” > “性能” > “设置”。在“视觉效果”选项卡中&#xff0c;选择“调整为最佳性能”以禁用不必要的动画和效果&#xff0c;或选择自定义禁用特定效果。 电源选项&…

高并发场景下的性能测试方法!

在现代互联网应用中&#xff0c;高并发场景下的性能测试显得尤为重要。无论是电商平台的秒杀活动&#xff0c;还是社交应用的突发流量&#xff0c;都需要确保系统能够在高并发情况下稳定运行。本文将详细介绍高并发场景下的性能测试方法&#xff0c;并提供具体的方案和实战演练…

苹果开发 IOS 证书生成步骤

前提条件 你手上有一台 Macbook你的苹果账号已被添加到开发人员中 证书创建步骤 打开 XCode 直接生成 p12证书生成后&#xff0c;就可在苹果开发者管理界面中看到你的证书记录登录苹果开发中心&#xff0c;创建 profiles 文件&#xff0c;并下载以上步骤即可&#xff0c;就这…

超萌!HTMLCSS:超萌卡通熊猫头

效果演示 创建了一个卡通风格的熊猫头 HTML <div class"box"><div class"head"><div class"head-copy"></div><div class"ears-left"></div><div class"ears-right"></di…

【Spark中创建RDD的两种方式】Spark中如何获取sc对象、以及创建RDD的两种方式

文章目录 一、Spark如何获取sc对象1、windons 本地模式获取sc对象2、linux 集群模式获取sc对象 二、创建RDD的两种方式1、并行化一个已存在的集合2、读取外部共享存储系统 一、Spark如何获取sc对象 不论是本地测试还是集群模式&#xff0c;都需要指定 JAVA_HOME 和 HADOOP_HOM…

RHCE第四天笔记

1.web服务器简介 &#xff08;1&#xff09;什么是www www是world wide web的缩写&#xff0c;也就是全球信息广播的意思。通常说的上网就是使用www来查询用户 所需要的信息。www可以结合文字、图形、影像以及声音等多媒体&#xff0c;并通过可以让鼠标单击超链接的方 式将信息…

springboot高校运动会管理系统-计算机毕业设计源码33814

摘要 本文旨在介绍基于Spring Boot框架和HTML技术开发的高校运动会管理系统。通过该系统&#xff0c;学校能够更高效地组织和管理校园内的各项体育赛事&#xff0c;提升运动会的组织效率和参与体验。系统整合了Spring Boot的强大功能和HTML的灵活性&#xff0c;为高校运动会管理…

Linux特种文件系统--tmpfs文件系统

tmpfs类似于RamDisk&#xff08;只能使用物理内存&#xff09;&#xff0c;使用虚拟内存&#xff08;简称VM&#xff09;子系统的页面存储文件。tmpfs完全依赖VM&#xff0c;遵循子系统的整体调度策略。说白了tmpfs跟普通进程差不多&#xff0c;使用的都是某种形式的虚拟内存&a…

森利威尔SL2516D 耐压60V内置5V功率MOS 支持PWM LED恒流驱动器芯片

一、基本特性 型号&#xff1a;SL2516D封装&#xff1a;ESOP8工作频率&#xff1a;140kHz驱动MOS管&#xff1a;内置 二、电气特性 输入电压范围&#xff1a;8V~100V&#xff08;注意&#xff0c;虽然问题中提到耐压60V&#xff0c;但根据官方信息&#xff0c;其实际耐压范围…

力扣287.寻找重复数

1.哈希表法 #include<stdio.h> #include<stdlib.h> int func(int *arr,int len) {int *hash(int *)malloc(sizeof(int)*len);for(int i0;i<len;i){if(hash[arr[i]]1){free(hash);return arr[i];}hash[arr[i]]1;}free(hash);return -1; }int main() {int arr[5]{…

服务器数据恢复—DELL EqualLogic PS6100系列存储简介及如何收集故障信息?

DELL EqualLogic PS6100系列存储采用虚拟ISCSI SAN阵列&#xff0c;支持VMware、Solaris、Linux、Mac、HP-UX、AIX操作系统&#xff0c;提供全套企业级数据保护和管理功能&#xff0c;具有可扩展性和容错功能。DELL EqualLogic PS6100系列存储介绍&#xff1a; 1、上层应用基础…

点云学习笔记3——读取点云文件、进行统计滤波/直通滤波后可视化

一、统计滤波 #include <iostream> #include <pcl/point_cloud.h> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/voxel_grid.h> #include <pcl/common/common_headers.h> #include <pcl/visualiza…

【笔面试常见题:三门问题】用条件概率、全概率和贝叶斯推导

1. 问题介绍 三门问题&#xff0c;又叫蒙提霍尔问题&#xff08;Monty Hall problem&#xff09;&#xff0c;以下是蒙提霍尔问题的一个著名的叙述&#xff0c;来自Craig F. Whitaker于1990年寄给《展示杂志》&#xff08;Parade Magazine&#xff09;玛丽莲沃斯莎凡特&#x…

C++ | Leetcode C++题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; class Solution { public:int countArrangement(int n) {vector<int> f(1 << n);f[0] 1;for (int mask 1; mask < (1 << n); mask) {int num __builtin_popcount(mask);for (int i 0; i < n; i) {if (mask &am…

windows临时安装solr

下载地址 https://dlcdn.apache.org/lucene/solr/8.11.4/solr-8.11.4.zip jdk1.8 解压&#xff0c;进入bin目录&#xff0c;打开cmd&#xff0c;执行这个命令就启动好了 .\solr.cmd start PS D:\xxxxx\solr-8.11.4\bin> .\solr.cmd start Java HotSpot(TM) 64-Bit Serv…

新160个crackme - 089-fornixcrackme1

运行分析 需要破解Name和Serial PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索找到关键字符串 动态分析关键函数&#xff0c;逻辑如上图&#xff0c;通过Name计算得到char_1&#xff0c;亦或后对比Serial&#xff0c;相等则返回成功信息 分析…