鱼C论坛

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

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

[复制链接]
发表于 2023-8-3 21:24:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如注释
#include<stdio.h>
int A[4]  = {4,3,2,1};

void QX(int *p)
{
        
        printf("*p = %d\n",*p);//打印指针p指向的数组第一个元素 

        printf("A的地址%d\n",A);
        printf("P的值%d\n",p);//此时P的值为main函数里数组b的地址 

        int **pp = &p;//定义一个指向指针的指针   这个指针指向p 
        *pp = A;//这个语句表示 pp指针指向的p指针的值修改为A的地址
                        //因为之前p的值数组是b的地址 现在改为数组A的地址 

        printf("*p = %d\n",*p);//那么这里打印的是A数组第一个元素 

        
        printf("A的地址%d\n",A);
        printf("P的值%d\n",p);
        
}


int main(void)
{

        int b[4] = {1,2,3,4};
        int *p = b;
        
        QX(p);//传递指针p进去 
        printf("*p = %d\n",*p); //从QX函数从来并未改变指针p的值 也就是说p的指向没有改变
        //为什么我用一个二级指针去尝试改变指针p却做不到呢? 

        
 return 0;
}
最佳答案
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,然后通过修改指针的地址来改变指针的指向。这样做可以实现指针的指向的改变。

以下是修改后的代码示例:
#include <stdio.h>int A[4] = {4, 3, 2, 1};void QX(int **pp) {    printf("*pp = %d\n", **pp);  // 打印指针pp所指向的地址的值,即指针p所指向数组的第一个元素    printf("A的地址 %p\n", A);  // 打印数组A的地址    printf("P的值 %p\n", *pp);  // 此时P的值为main函数里指针p的地址    *pp = A;  // 修改指针p的指向为数组A的地址    printf("*pp = %d\n", **pp);  // 打印被修改后的指针p所指向的地址的值,即数组A的第一个元素    printf("A的地址 %p\n", A);  // 打印数组A的地址    printf("P的值 %p\n", *pp);  // 打印修改后的指针p的值}int main(void) {    int b[4] = {1, 2, 3, 4};    int *p = b;    QX(&p);  // 传递指针p的地址给函数QX    printf("*p = %d\n", *p);  // 打印指针p所指向的地址的值    return 0;}
经过以上修改,你会发现指针 p 的指向成功地被改变为数组 A 的首地址。

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

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-3 21:24:40 | 显示全部楼层
问题出在这行代码上:
int **pp = &p;

在这里,你将指针 p 的地址赋值给了指向指针的指针 pp 。然后你尝试将 A 的地址赋值给 pp 指向的指针 p ,以此来改变 p 的指向。

然而,这种做法是错误的。因为 p 是一个普通的指针,它只能存储一个地址值,而不能存储指针的地址。所以使用二级指针 pp 去改变 p 的指向是行不通的。

正确的做法是直接将 A 的地址赋值给 p ,而不需要使用二级指针。修改代码如下:
void QX(int *p)
{
    printf("*p = %d\n", *p);
    printf("A的地址%d\n", A);
    printf("P的值%d\n", p);

    p = A;

    printf("*p = %d\n", *p);
    printf("A的地址%d\n", A);
    printf("P的值%d\n", p);
}

这样,指针 p 的指向就会被成功改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 21:24:50 | 显示全部楼层
问题分析:

在你的代码中,你尝试使用二级指针来改变指针 p 的值,但是却没有达到预期的结果。这是因为你在函数 QX 中将二级指针 pp 指向了指针 p,然后修改了 pp 指向的值为数组 A 的地址。虽然你修改了 pp 指向的值,但并没有真正改变原始指针 p 的值。

解决方案:

要在函数中通过传递一级指针来改变指针的值,你可以使用单级指针而不是二级指针。以下是修改后的代码示例:
#include <stdio.h>int A[4] = {4, 3, 2, 1};void QX(int *p) {    printf("*p = %d\n", *p); // 打印指针 p 指向的数组第一个元素    printf("A的地址%d\n", A);    printf("P的值%d\n", p); // 此时 p 的值为 main 函数里数组 b 的地址    p = A; // 将指针 p 的值修改为数组 A 的地址    printf("*p = %d\n", *p); // 打印指针 p 指向的数组第一个元素(现在为 A 数组的第一个元素)    printf("A的地址%d\n", A);    printf("P的值%d\n", p);}int main(void) {    int b[4] = {1, 2, 3, 4};    int *p = b;    QX(p); // 传递指针 p 进去    printf("*p = %d\n", *p); // 指针 p 的值没有改变(仍然为数组 b 的地址)    return 0;}
在修改后的代码中,首先将指针 p 的值打印出来,然后在函数内部将指针 p 的值修改为数组 A 的地址。这样,在函数中的打印语句中就可以正确地输出数组 A 的第一个元素。但是需要注意的是,因为你传递的是指针的副本,所以在函数外部的指针 p 的值并没有被改变。

希望以上解决方案能够帮助你理解并解决问题。如果还有其他疑问,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,然后通过修改指针的地址来改变指针的指向。这样做可以实现指针的指向的改变。

以下是修改后的代码示例:
#include <stdio.h>int A[4] = {4, 3, 2, 1};void QX(int **pp) {    printf("*pp = %d\n", **pp);  // 打印指针pp所指向的地址的值,即指针p所指向数组的第一个元素    printf("A的地址 %p\n", A);  // 打印数组A的地址    printf("P的值 %p\n", *pp);  // 此时P的值为main函数里指针p的地址    *pp = A;  // 修改指针p的指向为数组A的地址    printf("*pp = %d\n", **pp);  // 打印被修改后的指针p所指向的地址的值,即数组A的第一个元素    printf("A的地址 %p\n", A);  // 打印数组A的地址    printf("P的值 %p\n", *pp);  // 打印修改后的指针p的值}int main(void) {    int b[4] = {1, 2, 3, 4};    int *p = b;    QX(&p);  // 传递指针p的地址给函数QX    printf("*p = %d\n", *p);  // 打印指针p所指向的地址的值    return 0;}
经过以上修改,你会发现指针 p 的指向成功地被改变为数组 A 的首地址。

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

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-3 21:31:50 | 显示全部楼层
因为传递进函数的是值传递
传递进QX函数的指针p和外面的main函数的指针p的地址不是同一个  也就是两个不是同一个指针p   QX函数里的指针p只是一个副本 只是他们的值都是那个数组的地址  当我尝试修改p的值   其实修改的是副本p指针的值  main函数的指针p不会改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 14:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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