指针与地址的基本概念、运算及应用解析

该思维导图概述了指针与地址的相关概念,包括指针的定义、声明、初始化和解引用。介绍了指针运算的类型及其注意事项。讨论了指针与数组的关系,指针数组及数组指针的定义。还涵盖了动态存储分配的函数、内存泄漏问题,以及指针在字符串处理中的应用。最后,例举了指针在链表节点、函数参数传递和多级指针中的典型应用。

源码
# 指针与地址
- 指针
  - 定义
    - 存储变量地址的变量
  - 声明
    - int *p;
  - 初始化
    - p = &a;
    - 注意
      - 必须指向有效地址
  - 解引用
    - *p访问所指内容
    - 示例
      - int a = 10; *p = a; // 修改a的值
- 指针运算
  - 算术运算
    - p++ (移动sizeof(类型))
    - p + n (向后移动n个元素)
    - p - n (向前移动n个元素)
  - 关系运算
    - >, <, == (比较地址)
    - 注意
      - 只能比较同一类型指针
  - 注意事项
    - 越界风险
    - 指针类型影响运算结果
    - 注意野指针和悬空指针
- 指针与数组
  - 数组名
    - 视为首元素地址常量
    - 具有指针特性
  - 访问方式
    - arr[i] ⇔ *(arr + i)
    - 示例
      - int arr[5] = {1, 2, 3, 4, 5}; *(arr + 2) == 3
  - 指针数组
    - int *arr[10]; // 存储指针的数组
    - 应用
      - 保存多个字符串指针
  - 数组指针
    - int (*p)[10]; // 指向数组的指针
    - 应用
      - 用于二维数组
- 动态存储分配
  - 函数
    - malloc(size_t size) // 分配内存
    - calloc(size_t num, size_t size) // 分配并初始化为0
    - free(void *ptr) // 释放内存
  - 示例
    - int *p = (int*)malloc(10*sizeof(int)); // 分配int数组
  - 内存泄漏
    - 原因
      - 未释放分配的内存
      - 后果
        - 造成资源浪费
        - 程序崩溃
- 指针与字符串
  - 表示
    - char *s = "Hello"; // 字符串常量
  - 操作
    - strcpy(destination, source); // 字符串复制
    - strlen(s); // 计算字符串长度
  - 与字符数组区别
    - 可修改性
      - 字符串常量不可修改
      - 字符数组可修改
- 典型应用
  - 链表节点
    - struct Node { int data; Node* next; }; // 节点定义
    - 创建链表
      - 初始化头节点
      - 插入节点
  - 函数参数传递
    - 修改实参(通过地址传递)
    - 示例
      - void change(int *p) { *p = 20; }
  - 多级指针
    - int **pp; // 指向指针的指针
    - 应用
      - 动态二维数组
图片
指针与地址的基本概念、运算及应用解析