You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指针的用途:初学者对指针广泛应用的困惑与疑问

指针核心疑问解答

为什么不能直接用另一个变量存值?

直接存值不是不行,但碰到两种场景就会很麻烦:

  1. 需要修改原始变量:如果给函数传值,函数里操作的是变量的副本,修改完不会影响原变量。比如交换两个整数,传值的话根本改不了原始值,必须用指针直接操作原内存地址的数据。
    // 传值的交换函数(无效)
    void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }
    
    // 用指针的交换函数(有效)
    void swap(int *a, int *b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
  2. 数据量很大时的开销:比如你要传递一个包含1000个元素的数组或者大结构体,直接存值会复制整个数据,不仅占额外内存,复制过程也很慢。而指针只需要存一个内存地址(32位系统4字节,64位8字节),不管数据多大,开销都极小。

指针如何节省内存?

  • 避免重复复制大对象:如果多个地方需要引用同一个大结构体或数组,用指针的话每个引用只占几个字节,而存副本的话内存占用是N倍的对象大小。比如一个1KB的结构体,100个引用用指针只占800字节(64位),存副本就要100KB。
  • 动态内存分配:指针配合malloc/free可以按需分配内存。比如你不知道要存多少用户数据,用动态数组(指针)可以只分配实际需要的内存,而静态数组如果开得太大就会浪费空间,开太小又不够用。

指针如何提升算法效率?

指针本身不直接改变时间复杂度,但它是实现高效算法的基础:

  • 动态数据结构的高效操作:比如链表的插入、删除,用指针可以在O(1)时间完成(找到节点后直接修改指针指向),而数组做同样操作需要移动后面的所有元素,时间复杂度是O(n)。
  • 避免不必要的复制:比如快速排序,用指针直接在原数组上交换元素,不需要额外的辅助数组,既省内存又省复制数据的时间。
  • 直接内存访问:指针可以跳过中间层直接访问目标内存,比如处理字符串时,用指针遍历比用数组下标更高效(虽然编译器优化后差别不大,但原理上更直接)。

其他相关补充

  • 指针的核心用途:除了上面说的,指针还能实现函数指针(C语言里模拟多态)、处理动态字符串、构建树/图等复杂数据结构,这些都是直接存值做不到的。
  • 需要注意的风险:野指针(指向无效内存)、空指针解引用会导致程序崩溃,动态分配的内存忘记释放会造成内存泄漏,但这些都可以通过规范的编程习惯避免,比如使用前检查指针是否为空,动态分配后记得释放。

内容的提问来源于stack exchange,提问作者Raj Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:02:30