【发布时间】: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 = &x;,但代码中的行实际上开头没有*。请更准确地分析您的代码/错误。 -
请阅读如何创建 MCVE (minimal reproducible example)。您可以大大减少代码。
-
感谢您的提醒!我会确保遵守 MCVE。