请解释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
相关产品推荐
相关产品推荐

