a905448839 发表于 2023-8-3 21:24:25

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

如注释
#include<stdio.h>
int A= {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 = {1,2,3,4};
        int *p = b;
       
        QX(p);//传递指针p进去
        printf("*p = %d\n",*p); //从QX函数从来并未改变指针p的值 也就是说p的指向没有改变
        //为什么我用一个二级指针去尝试改变指针p却做不到呢?

       
return 0;
}

isdkz 发表于 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 的指向就会被成功改变。

Mike_python小 发表于 2023-8-3 21:24:50

问题分析:

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

解决方案:

要在函数中通过传递一级指针来改变指针的值,你可以使用单级指针而不是二级指针。以下是修改后的代码示例:


#include <stdio.h>

int A = {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 = {1, 2, 3, 4};
    int *p = b;

    QX(p); // 传递指针 p 进去

    printf("*p = %d\n", *p); // 指针 p 的值没有改变(仍然为数组 b 的地址)

    return 0;
}


在修改后的代码中,首先将指针 p 的值打印出来,然后在函数内部将指针 p 的值修改为数组 A 的地址。这样,在函数中的打印语句中就可以正确地输出数组 A 的第一个元素。但是需要注意的是,因为你传递的是指针的副本,所以在函数外部的指针 p 的值并没有被改变。

希望以上解决方案能够帮助你理解并解决问题。如果还有其他疑问,请随时提出。

学习编程中的Ben 发表于 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, 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 = {1, 2, 3, 4};
    int *p = b;

    QX(&p);// 传递指针p的地址给函数QX

    printf("*p = %d\n", *p);// 打印指针p所指向的地址的值

    return 0;
}

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

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

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

a905448839 发表于 2023-8-3 21:31:50

因为传递进函数的是值传递
传递进QX函数的指针p和外面的main函数的指针p的地址不是同一个也就是两个不是同一个指针p   QX函数里的指针p只是一个副本 只是他们的值都是那个数组的地址当我尝试修改p的值   其实修改的是副本p指针的值main函数的指针p不会改变
页: [1]
查看完整版本: 为什么我用一个二级指针去尝试改变指针p却做不到呢?