【问题标题】:Updating a variable indirectly间接更新变量
【发布时间】:2017-07-16 15:28:45
【问题描述】:

我正在学习 C 并且我被分配了一项任务。

“通过添加一个存储 x 地址的新变量来修改程序。然后使用您的变量(间接)更新 i 的值,然后打印出新值以证明您的修改已经生效。” 这是我必须修改的代码:

#include <stdio.h>
int main()
{
    int i, j;
    int * p, * q;
    int ** x;

    i = 100;
    j = 200;
    p = &i;
    q = &j;
    x = &p;

    *p = *p + *q;
    *q = **x / 2;
    **x = *p + j;

    printf(" i = %d\n",   i);
    printf("&i = %p\n",  &i);
    printf(" j = %d\n",   j);
    printf("&j = %p\n",  &j);

    printf(" p = %p\n",   p);
    printf("&p = %p\n",  &p);
    printf("*p = %d\n",  *p);
    printf(" q = %p\n",   q);
    printf("&q = %p\n",  &q);
    printf("*q = %d\n",  *q);

    printf(" x = %p\n",   x);
    printf("&x = %p\n",  &x);
    printf("*x = %p\n",  *x);
    printf("**x= %d\n", **x);
    return 0;
}

这是我尝试过的。我声明了存储地址的变量。然后我将 x 的 x 的地址(newVariable)分配给它,然后尝试创建地址 i 的增量更新。编译程序给了我以下错误:

ptr3.c:14:18: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
     *newVariable = &x; /* Assign new variable address of x */
                  ^
ptr3.c:19:19: error: lvalue required as unary ‘&’ operand
     newVariable = &i++; /* Autoincrement address by 1 */
                   ^
ptr3.c:21:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("&newVariable = %d\n", newVariable); /* New printf statement */
        ^

代码:

#include <stdio.h>
int main()
{
    int i, j;
    int * p, * q;
    int ** x; 
    int * newVariable; /* New variable of type address*/

    i = 100;
    j = 200;
    p = &i;
    q = &j;
    x = &p;
    newVariable = &x; /* Assign new variable address of x */

    *p = *p + *q;
    *q = **x / 2;
    **x = *p + j;
    newVariable = &i++; /* Autoincrement address by 1 */

    printf("&newVariable = %d\n", newVariable); /* New printf statement */

    printf(" i = %d\n",   i);
    printf("&i = %p\n",  &i);
    printf(" j = %d\n",   j);
    printf("&j = %p\n",  &j);

    printf(" p = %p\n",   p);
    printf("&p = %p\n",  &p);
    printf("*p = %d\n",  *p);
    printf(" q = %p\n",   q);
    printf("&q = %p\n",  &q);
    printf("*q = %d\n",  *q);

    printf(" x = %p\n",   x);
    printf("&x = %p\n",  &x);
    printf("*x = %p\n",  *x);
    printf("**x= %d\n", **x);

    return 0;
}

版本 3:

#include <stdio.h>
int main()
{
    int i, j;
    int * p, * q;
    int ** x; 
    int * newVariable; /* New variable of type address*/

    i = 100;
    j = 200;
    p = &i;
    q = &j;
    x = &p;
    newVariable = &x; /* Assign new variable address of x */

    *p = *p + *q;
    *q = **x / 2;
    **x = *p + j;
    newVariable = &i++; /* Autoincrement address by 1 */

    printf("&newVariable = %d\n", newVariable); /* New printf statement */

    printf(" i = %d\n",   i);
    printf("&i = %p\n",  &i);
    printf(" j = %d\n",   j);
    printf("&j = %p\n",  &j);

    printf(" p = %p\n",   p);
    printf("&p = %p\n",  &p);
    printf("*p = %d\n",  *p);
    printf(" q = %p\n",   q);
    printf("&q = %p\n",  &q);
    printf("*q = %d\n",  *q);

    printf(" x = %p\n",   x);
    printf("&x = %p\n",  &x);
    printf("*x = %p\n",  *x);
    printf("**x= %d\n", **x);

    return 0;
}

谁能告诉我我做错了什么?我看不出程序有什么问题。

【问题讨论】:

  • 如果 NewVariable 旨在指向一个整数,那么将其声明为 int *NewVariable 是合适的。但是你不打算让它保存一个整数的地址。它旨在保存int ** 类型变量的地址。所以应该声明为int ***NewVariable
  • 代码相当多。你能把失败的部分减少到两三行吗?
  • 您的第一个错误显示*newVariable = &amp;x;,但代码中的行实际上开头没有*。请更准确地分析您的代码/错误。
  • 请阅读如何创建 MCVE (minimal reproducible example)。您可以大大减少代码。
  • 感谢您的提醒!我会确保遵守 MCVE。

标签: c pointers


【解决方案1】:

如果新变量将保存x 的地址,它需要是一个 指向x 类型的指针,即int **。所以:

int ***newVariable;

您正确分配了x 的地址,其中:

newVariable = &x;

要修改i,让我们考虑一下。原来x自己点 指向指向i 的其他东西(在本例中为p)。所以 newVariable 增加了一个额外的级别,这意味着你只需要 取消引用它三个级别以访问i。例如,如果您 想通过增加它来修改i,你可以这样做:

***newVariable += 3; // increment i (indirectly) by 3

要打印i的值,你可以直接使用它自己,或者p 指向它,或x 指向p,或newVariable 指向x。所以这些语句将产生相同的结果:

printf("i = %d\n", i);
printf("i = %d\n", *p);
printf("i = %d\n", **x);
printf("i = %d\n", ***newVariable);

【讨论】:

  • 感谢您的帮助并逐步解释解决方案!
【解决方案2】:

您不应在一个文件中提供两个 main() 函数。

第一个问题在于 newVariable 定义:

int ** x; /* pointer to pointer */
/* Since you want to store adress of x, you should declare pointer to pointer to pointer */
int *** newVariable; /* variable to store adress of x */

第二个问题是如何间接增加 i 值:

/* Since newVariable -> x -> p -> i (where "->" means "is a pointer to") */
(***newVariable)++; /* increment value of i by 1 */

【讨论】:

    【解决方案3】:

    你需要使用***newVar并指向x的地址。然后你可以改变newVar的指向值并显示x也改变了。

    #include <stdio.h>
    int main()
    {
        int i, j;
        int * p, * q;
        int ** x;
        int *** newVar;
    
        i = 100;
        j = 200;
        p = &i;
        q = &j;
        x = &p;
        newVar = &x;
    
        // prove that newVar is pointing to same as x
        printf("**x= %d\n", **x);                 //100
        ***newVar = 12345;
        printf("***newVar= %d\n", ***newVar);     //12345
        printf("**x= %d\n", **x);                 //12345
        printf("*p= %d\n", *p);                   //12345
        printf("i= %d\n", i);                     //12345
    
        //prove that they are all pointing to same address
        printf("p= %p\n", p);                     
        printf("*x= %p\n", *x);
        printf("**newVar= %p\n", **newVar);   
    
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多