【编程语言】理解C/C++当中的指针

【编程语言】理解C/C++当中的指针

指针是C/C++语言中一个非常强大且重要的概念,也是编写高效程序的基础之一。对于没有编程背景的初学者来说,理解指针可能有些难度,但通过本篇文章的介绍,相信你会对指针有一个清晰的认识。本文将从指针的基本概念、作用、代码示例、注意事项等方面,带你一步步了解指针的世界。

什么是指针?

在C/C++中,指针是一种特殊的变量,它存储的是另一个变量的内存地址,而不是一个普通的数值。

  • 举例来说,如果我们有一个变量int a = 5;,那么指针变量的值可以是a所在的内存地址。通过指针,我们可以访问或修改这个地址所存储的数值。

简单来说,指针是指向一个内存位置的变量,它可以帮助我们在程序中更灵活地操控数据。

为什么需要指针?

指针的出现主要是为了实现灵活的数据操作和优化内存使用。以下是指针的几个常见用途:

  1. 间接访问和修改变量:通过指针,可以在函数中修改传入的变量。
  2. 动态内存管理:指针是动态分配内存(如mallocnew)的关键。
  3. 提高性能:指针可以直接访问内存,从而提高程序性能。
  4. 实现复杂的数据结构:如链表、树和图等数据结构的实现,离不开指针。

指针的灵活性和高效性,使得它在系统编程和底层操作中得到了广泛应用。

指针的声明与初始化

在C/C++中,声明一个指针的语法是类型* 指针变量名;。下面是一个简单的指针声明和初始化示例:

int a =10;// 普通变量int* p =&a;// 指针p存储变量a的地址

在上面的代码中:

  • int a = 10; 定义了一个整型变量a,并赋值为10。
  • int* p = &a; 定义了一个指向整数的指针p,并将a的地址赋给p
  • &a 是获取变量a的内存地址的操作符。

通过指针p,我们可以访问和修改变量a的值。

访问和修改指针指向的值

指针不仅可以存储变量地址,还可以通过它访问或修改该地址所存储的数据。我们可以使用解引用操作符*来完成这个操作:

int a =10;int* p =&a; cout <<*p << endl;// 输出10*p =20;// 修改指针指向的值 cout << a << endl;// 输出20

示例:利用指针实现值交换

以下代码展示了如何通过指针实现两个数的交换:

#include<iostream>usingnamespace std;voidswap(int* x,int* y){int temp =*x;*x =*y;*y = temp;}intmain(){int a =5, b =10;swap(&a,&b); cout <<"a = "<< a <<", b = "<< b << endl;// 输出:a = 10, b = 5return0;}

swap函数中,我们通过指针参数来修改ab的值,实现了变量的交换。

动态内存分配

C++提供了newdelete关键字来进行动态内存分配,而C语言中则使用mallocfree

int* p =newint;// 为int类型分配动态内存*p =10;// 赋值 cout <<*p << endl;delete p;// 释放内存

动态内存分配在管理大量数据时非常有用。比如在创建大型数组或在链表、树等数据结构中,通过动态分配可以按需分配内存,提高资源利用效率。

注意事项

使用指针需要小心,因为错误的指针操作会导致严重的问题。以下是一些常见注意事项:

  1. 初始化指针:声明指针时一定要初始化,避免指针指向不明内存。
  2. 释放动态内存:使用newmalloc分配的内存,必须使用deletefree来释放,否则会造成内存泄漏。
  3. 空指针检查:访问指针前,检查指针是否为空,以避免程序崩溃。
  4. 避免野指针:释放内存后立即将指针置为nullptr,避免指针指向非法区域。

示例:空指针和野指针

int* p =nullptr;// 空指针if(p !=nullptr){ cout <<*p << endl;// 确保指针非空后再使用}int* q =newint(10);delete q; q =nullptr;// 防止成为野指针

指针的拓展:指针数组与多级指针

指针的应用不仅限于单一的变量,它还可以与数组、多级指针结合使用,拓展出更强大的功能。

指针数组

指针数组是一个数组,其中每个元素都是指向同类型数据的指针。它常用于存储多个字符串指针。

constchar* arr[]={"Hello","World","C++"};for(int i =0; i <3;++i){ cout << arr[i]<< endl;// 输出每个字符串}

多级指针

多级指针是指指向指针的指针。例如int**表示指向int*类型的指针。

int a =10;int* p =&a;int** pp =&p;// 二级指针,指向指针p的地址 cout <<**pp << endl;// 输出10

多级指针主要用于复杂的数据结构和多维数组操作。

总结

指针是C/C++中一个不可或缺的概念,通过指针我们可以灵活高效地操控数据。指针的基本用法包括声明与初始化、解引用、动态内存分配等。在使用指针时要小心各种错误,确保指针安全。掌握指针不仅有助于理解C/C++的核心思想,对深入学习数据结构、内存管理等编程知识也大有裨益。

Read more

2026最新 Python+AI 入门指南:0基础也能快速上手,避开90%新手坑

2026最新 Python+AI 入门指南:0基础也能快速上手,避开90%新手坑

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 文章目录: * 【前言】 * 一、为什么2026年入门AI,首选Python?(新颖热点解读) * 二、Python+AI入门必备:前提+环境搭建(10分钟搞定) * 2.1 核心前提(不用啃硬骨头) * 2.2 环境搭建(Windows/Mac通用,避版本冲突) * 三、Python+AI入门实战:3个热门案例(附完整代码) * 案例1:数据处理(AI入门必备,80%AI开发第一步) * 案例2:机器学习入门(线性回归,房价预测) * 案例3:2026热门·大模型对接(LangChain快速调用) * 四、

By Ne0inhk
【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论 : 本章是动态规划算法的基础入门篇,我将通过三道简单题 + 一道中等难度的一维动态规划题来带你对动态规划有个初认识,并基本了解动态规划的最基本常见的写法,只有将基本写法了解了,对后续的难的题目自然也不会毫无头绪,后续还将持续更新更多相关的动规算法,敬请期待~🙃 ———————— 早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。 👻动态规划🌥️ 这里通过大量练习得出下面动态规划做题步骤 简单的说动态规划理解成:某种状态的公式 + 提前求出来值的容器 求出当前位置的值然后放到容器中后后续使用 因为最开始的值一般是会看见的所以就能有初始值,从而启动动态规划 从上中可以主要提炼出: * 状态 * 容器的重要性 * 公式,可以换种说法:状态转移方程 这样严格😈的说:动态规划 = 状态定义 + 状态转移方程 + 初始条件 + 状态存储(容器) 下述步骤是通过写完下述四道题后的总结,所以同样需要道友🗡️大量的练习沉淀最终就能对动态规划的题目

By Ne0inhk
告别付费行情软件:利用 QMT 免费“白嫖”全市场 Tick 级数据 (附 Python 代码)

告别付费行情软件:利用 QMT 免费“白嫖”全市场 Tick 级数据 (附 Python 代码)

前言:作为一名量化开发者,我每年最心疼的支出不是服务器费用,而是数据源费用。Wind 终端一年几万,Tushare 积分也要钱,稍微好点的 Tick 数据源动辄上千。但其实,很多散户手里就握着一把“金钥匙”却不自知——那就是券商免费提供的 QMT。今天,我将教你如何把 QMT 变成一个免费、稳定、实时的行情数据中心。 为什么 QMT 的数据最“香”? 在数据获取这条路上,我们通常有三个选择: 1. 爬虫:容易被封 IP,数据不稳定,且有法律风险。 2. 第三方 API (Tushare/JoinQuant):好用但要钱,免费版有各种限制(如延迟、限流)。 3. 券商 QMT/PTrade:完全免费,速度极快(

By Ne0inhk
蓝桥杯(C 语言 / C++)备考全攻略:3-6 个月从入门到上岸,语法 / 算法 / 真题 + 模板直接用

蓝桥杯(C 语言 / C++)备考全攻略:3-6 个月从入门到上岸,语法 / 算法 / 真题 + 模板直接用

蓝桥杯作为国内极具含金量的编程竞赛,是大学生提升编程能力、丰富简历的重要选择。本文针对 C 语言 / C++ 方向,打造 3-6 个月备考计划,从语法基础到算法进阶,再到真题实战,梳理高频考点并提供可直接复用的代码模板,帮你高效备考、稳步上岸。 一、备考规划:3-6 个月阶段拆解(零基础友好) 1. 基础阶段(1-2 个月):夯实语法与工具         核心目标:掌握 C/C++ 基础语法,熟练使用编译器(Dev-C++/VS Code),能独立编写简单程序。         每日学习时长:2-3 小时。 (1)语法重点(按优先级排序) * 核心语法:变量 / 常量、数据类型(int/long long/double/

By Ne0inhk