鱼C论坛

 找回密码
 立即注册
查看: 2623|回复: 4

[已解决]为什么我用一个二级指针去尝试改变指针p却做不到呢?

[复制链接]
发表于 2023-8-3 21:25:00 | 显示全部楼层    本楼为最佳答案   
问题分析:

在你的代码中,你尝试使用一个二级指针来改变指针 p 的值,但是发现 p 并没有被改变。让我们逐步分析一下原因:

1. 在函数 QX 内部,你定义了一个指向指针的指针 pp,并将其初始化为 &p,即 pp 指向了指针 p 的地址。

2. 接着,你尝试将 *pp 的值修改为数组 A 的地址,即 *pp = A;。由于 pp 指向了 p 的地址,这个赋值操作实际上将指针 p 的值修改为了数组 A 的地址。

3. 然后,你打印了 *p,这里输出的是数组 A 的第一个元素。这是因为前面已经将指针 p 的值修改为了数组 A 的地址。

4. 但是,在函数 main 中,当你再次打印 *p 时,你发现 p 的指向并没有改变。这是因为在函数 QX 内部,你改变的是 p 的值(也就是指针的内容),而不是 p 本身。所以在函数 main 中,p 的指向没有发生变化。

解决方案:

如果你想要在函数 QX 中改变指针 p 的指向,你可以将指针的地址传递给函数 QX,然后通过修改指针的地址来改变指针的指向。这样做可以实现指针的指向的改变。

以下是修改后的代码示例:
  1. #include <stdio.h>
  2. int A[4] = {4, 3, 2, 1};
  3. void QX(int **pp) {
  4.     printf("*pp = %d\n", **pp);  // 打印指针pp所指向的地址的值,即指针p所指向数组的第一个元素
  5.     printf("A的地址 %p\n", A);  // 打印数组A的地址
  6.     printf("P的值 %p\n", *pp);  // 此时P的值为main函数里指针p的地址
  7.     *pp = A;  // 修改指针p的指向为数组A的地址
  8.     printf("*pp = %d\n", **pp);  // 打印被修改后的指针p所指向的地址的值,即数组A的第一个元素
  9.     printf("A的地址 %p\n", A);  // 打印数组A的地址
  10.     printf("P的值 %p\n", *pp);  // 打印修改后的指针p的值
  11. }
  12. int main(void) {
  13.     int b[4] = {1, 2, 3, 4};
  14.     int *p = b;
  15.     QX(&p);  // 传递指针p的地址给函数QX
  16.     printf("*p = %d\n", *p);  // 打印指针p所指向的地址的值
  17.     return 0;
  18. }
复制代码

经过以上修改,你会发现指针 p 的指向成功地被改变为数组 A 的首地址。

希望以上解答能够解决你的问题。如果还有疑问,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-24 05:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表