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