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

请解释C/C++双指针工作原理,并分析示例代码的输出结果

C/C++双指针工作原理及代码示例分析

一、双指针(Double Pointer)的工作原理

双指针就是指向指针的指针,本质是存储另一个指针变量内存地址的变量:

  • 普通指针(比如int* p)存储的是基础类型变量的地址,通过一次解引用(*p)就能访问对应的值;
  • 双指针(比如int** x)存储的是普通指针的地址,需要两次解引用(**x)才能访问到最终的基础类型值。

它的核心用途是修改指针本身的指向(比如在函数内部修改外部传入的指针),或者处理二维数组、指针数组这类多层级的内存结构。

二、示例代码逐行分析

先看完整代码:

int main(void) {
    int anArray[] = {5,16,33,99};
    int * p = anArray;

    printf("*p = %d\n", *p);
    p++;
    printf("Now *p = %d\n", *p);

    int * q = &anArray[3];
    int ** x = &q;
    **x = 12;
    *x = p;
    **x = 42;
    q[1] = 9;

    for (int i =0; i < 4; i++){
        printf("anArray[%d] = %d\n",i, anArray[i]);
    }

    return EXIT_SUCCESS;
}

1. 初始变量与前两次输出

  • anArray是连续存储的int数组,初始值为{5, 16, 33, 99},数组名等价于指向第一个元素的指针&anArray[0];
  • p = anArray让p指向anArray[0],所以第一次printf输出*p = 5;
  • p++后,指针根据int类型的大小(通常4字节)移动地址,指向anArray[1],第二次printf输出Now *p = 16。

2. 双指针操作对数组的修改

  • int * q = &anArray[3]:q指向数组最后一个元素anArray[3],此时*q = 99;
  • int ** x = &q:x是双指针,存储q的地址,此时**x等价于*q,也就是anArray[3]的值;
  • **x = 12:两次解引用修改anArray[3],数组变为{5, 16, 33, 12};
  • *x = p:单解引用修改q的指向,让q和p一样指向anArray[1];
  • **x = 42:此时**x等价于*q,也就是anArray[1]的值,修改后数组变为{5, 42, 33, 12};
  • q[1] = 9:q[1]等价于*(q+1),q指向anArray[1],q+1指向anArray[2],所以修改后数组变为{5, 42, 9, 12}。

3. 最终循环输出

最后循环遍历数组,输出结果为:

anArray[0] = 5
anArray[1] = 42
anArray[2] = 9
anArray[3] = 12

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:54:23