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

指针入门C++

🌱 什么是指针?

指针就是一个变量,专门用来存储“地址”。

在 C++ 中,每个变量在内存中都有一个地址,指针就是用来保存这个地址的。

✍️ 一个简单的例子

#include <iostream>
using namespace std;

int main() {
    int a = 10;         // 普通变量
    int* p = &a;        // 指针变量,保存a的地址

    cout << "a 的值是: " << a << endl;
    cout << "a 的地址是: " << &a << endl;
    cout << "p 保存的地址是: " << p << endl;
    cout << "p 指向的值是: " << *p << endl;

    return 0;
}

🧠 输出解释:

  • a 是一个普通的整数变量。

  • &aa 的地址。

  • p 是一个“指向 int 类型”的指针。

  • *p 是“p 指向的那个地址里的值”,也就是 a 的值。


🎯 图示理解(假装这是内存):

变量名地址
a100x1234
p0x12340x5678

你可以想象指针就像一张藏宝图,p 是藏宝图,*p 是藏起来的宝贝(也就是 a 的值)。

📌 小练习:

你可以试试看下面这段代码,然后修改 a 的值或者加一个新变量看看输出会怎样:

int b = 20;
int* q = &b;
cout << *q << endl;

🧩 第一部分:指针和数组的关系

🌟 核心概念:

  • 数组名 arr 在表达式中会自动转成一个指向首元素的指针

  • int arr[3] = {10, 20, 30};
    int* p = arr;  // 等价于 int* p = &arr[0];
    

    💡 你可以这样访问数组

  • cout << arr[0] << " " << *(p + 0) << endl;  // 都是 10
    cout << arr[1] << " " << *(p + 1) << endl;  // 都是 20
    

    小练习

  • int arr[5] = {1, 2, 3, 4, 5};
    int* p = arr;
    for (int i = 0; i < 5; i++) {
        cout << *(p + i) << " ";
    }
    

    🎁 第二部分:指针传参(函数参数)

    🧠 为什么用指针?

    因为函数参数默认是“值传递”,对参数的改动不会影响外面。但指针可以“传地址”,直接修改原数据!

    🔧 示例:交换两个数

  • void swap(int* a, int* b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    int x = 5, y = 10;
    swap(&x, &y);
    cout << x << " " << y; // 输出 10 5
    

    📚 第三部分:指针和函数的配合(数组传参)

    🎯 实战:数组求和

  • int sum(int* arr, int size) {
        int total = 0;
        for (int i = 0; i < size; i++) {
            total += arr[i];
        }
        return total;
    }
    
    int nums[4] = {2, 4, 6, 8};
    cout << sum(nums, 4); // 输出 20
    

    🚀 第四部分(进阶):指针的指针

    🌀 概念:

  • 一个指针变量本身也有地址,所以我们可以用另一个指针来指向它——这就叫做“指针的指针”。

  • int a = 100;
    int* p = &a;
    int** pp = &p;
    
    cout << a << endl;     // 100
    cout << *p << endl;    // 100
    cout << **pp << endl;  // 100
    

    🧠 应用场景(了解):

  • 二维数组

  • 修改函数参数中的指针

  • 动态内存管理(堆上的数组、链表)

  • 🗂️ 总结学习路线

    阶段内容练习建议
    入门数组和指针用指针遍历数组
    基础指针传参写 swap、求和、反转
    提升指针函数参数自己封装数组工具函数
    进阶指针的指针学链表、二维数组

🎯 C++ 指针实战练习套题

Level 1:基础理解(数组和指针)

🧪 练习 1:用指针输出数组中的所有元素

要求: 定义一个数组,使用指针遍历并输出。

int arr[5] = {5, 10, 15, 20, 25}; // 用指针 p 输出所有元素

🌱 提示: 定义 int* p = arr; 然后用 *(p + i) 访问。


🧪 练习 2:修改数组中的值(指针版)

要求: 把数组中所有值乘 2,然后输出。

int nums[4] = {1, 2, 3, 4}; // 用指针修改 nums 里的值


Level 2:指针传参 + 函数操作

🧪 练习 3:写一个 swap() 函数,用指针交换两个整数

要求: 写一个 void swap(int* a, int* b); 函数,交换两个数。


🧪 练习 4:用函数 + 指针传参反转数组

要求: 写一个 reverse(int* arr, int size) 函数,反转数组内容。

int a[5] = {1, 2, 3, 4, 5}; reverse(a, 5); // 结果应该是 5 4 3 2 1


🧪 练习 5:写一个 findMax(int* arr, int n) 函数,返回数组中最大值

Level 3:进阶挑战(指针的指针 & 多维数组)

🧪 练习 6:使用指针的指针修改变量的值

要求:

void changeValue(int** p) { **p = 999; }

调用方式:

int a = 10; int* p = &a; changeValue(&p);


🧪 练习 7:用指针访问二维数组

int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} }; // 用指针访问每个元素并输出


文章转载自:

http://Gq3ohb4W.ckdgj.cn
http://sXWfHT7O.ckdgj.cn
http://9KO6lRgb.ckdgj.cn
http://cenYCHKx.ckdgj.cn
http://s7dXRhKa.ckdgj.cn
http://AtEUwFR2.ckdgj.cn
http://UxFT2l54.ckdgj.cn
http://qDhvSMTm.ckdgj.cn
http://8a5lDnuY.ckdgj.cn
http://DnQibKiH.ckdgj.cn
http://YpJZ8wgD.ckdgj.cn
http://iRvr6Qby.ckdgj.cn
http://k3M19nGR.ckdgj.cn
http://YHs6T2LH.ckdgj.cn
http://7QiThNg5.ckdgj.cn
http://3WL1uOXr.ckdgj.cn
http://JZU51lNL.ckdgj.cn
http://tERSuLFt.ckdgj.cn
http://1YilxqkS.ckdgj.cn
http://6g4CoUa7.ckdgj.cn
http://8f843fSD.ckdgj.cn
http://bWgD7wkh.ckdgj.cn
http://Zg97keVb.ckdgj.cn
http://TtjnNhvL.ckdgj.cn
http://qtVZITt7.ckdgj.cn
http://iF24ApM1.ckdgj.cn
http://an8bVmEA.ckdgj.cn
http://EptHNg4B.ckdgj.cn
http://1rpk6456.ckdgj.cn
http://0DF1TG44.ckdgj.cn
http://www.dtcms.com/a/130464.html

相关文章:

  • wkhtmltopdf 实现批量对网页转为图片的好工具,快速实现大量卡片制作
  • 数学建模学习资料免费分享:历年赛题与优秀论文、算法课程、数学软件等
  • Java基础自学(1):一个简单的Java程序
  • 如何使用PyCharm自动化测试
  • 医药采购系统平台第4天03:实现根据用户的角色显示不同用户的权限菜单编写拦截器实现权限拦截模块的开发流程和测试流程小节
  • FileReader 详细解析与记忆方法
  • DataEase同比环比
  • 微信小程序实战案例 - 餐馆点餐系统 阶段 2 – 购物车
  • 嵌入式常见概念的介绍
  • C++ 重构muduo网络库
  • FPGA 37 ,FPGA千兆以太网设计实战:RGMII接口时序实现全解析( RGMII接口时序设计,RGMII~GMII,GMII~RGMII 接口转换 )
  • 微信小程序跳4
  • RT-2论文深度解读:视觉-语言-动作统一模型的机器人泛化革命
  • AI NAS:当网络存储与人工智能深度融合的技术路径与未来展望
  • nvm使用手册
  • java零基础教学笔记
  • 02核心-EffectSpec,EffectContext
  • RV1106 OCR 识别算法
  • 代码随想录算法训练营day3(链表)
  • 流与分组的共生关系
  • vue + uniapp 实现仿百度地图/高德地图/美团/支付宝 滑动面板 纯css 实现
  • Matlab个性化绘图第10期—滑珠进度柱状图
  • 富文本编辑器的内容导出html,并保留图片
  • 【第41节】windows的中断与异常及异常处理方式
  • 【第四十周】文献阅读:用于检索-增强大语言模型的查询与重写
  • 精品整理 | 云安全知识证书 (CCSK) v5 备考学习资源汇总
  • Reinforcement Learning-Autonomous car-useful
  • 【数学建模】(智能优化算法)粒子群优化算法(PSO)详解与Python实现
  • 【STM32】STemWin库,使用template API
  • vs2022 pcl1.15.0注意点