我正在使用扫描主程序中的数字的程序。之后,该程序调用函数change_number(),并作为参数给出数字内存地址。在此程序之后,应在子程序中将数字加3,然后在子程序中打印出来并恢复该新值。但是,当尝试在子程序change_number()中输出数字时,它会打印出它的内存地址。我的理解是程序应该在引用带有* -notation的指针时或仅通过插入变量名称时返回整数值。我尝试过的另一个编译器会出现以下错误消息,甚至无法使用x -notation或* pointer_x -notation进行编译:
我不明白,因为我的指针是作为整数引入的,就像整数本身一样。这是代码:
#include<stdio.h>
void change_number(int *x);
int main()
{
int x;
printf("Give number x: ");
scanf("%d", &x);
printf("In main program: x = %d\n", x);
change_number(&x);
printf("In main program: x = %d\n", x);
return 0;
}
void change_number(int *x)
{
int *pointer_x;
pointer_x = &x;
x = x + 3;
printf("In sub program: x = %d\n", *pointer_x);
}
答案 0 :(得分:1)
您已粘贴的代码无法在pointer_x = &x;
行编译,因为x
和pointer_x
的类型为int*
在指针变量上使用address-of运算符会为您提供指向指针的指针 - 在这种情况下,&x
会生成int**
此外,第x = x + 3
行将内存中的指针位置提前3*sizeof(int)
个字节,而不是修改原始int
变量。
也许您打算改为写*x = *x + 3
?
void change_number(int *x)
{
int *pointer_x;
pointer_x = x;
*x = *x + 3;
printf("In sub program: x = %d\n", *pointer_x);
}
答案 1 :(得分:0)
参数x
已包含来自x
的变量main
的地址,因此必须将其写为
void change_number(int *x)
{
int *pointer_x;
pointer_x = x;
*x = *x + 3;
printf("In sub program: x = %d\n", *pointer_x);
}
答案 2 :(得分:0)
当您撰写void change_number(int *x)
时,x
作为int *
收到。因此,x
指向int
,*x
指向int
。
所以你需要改变以下内容:
pointer_x = x;
*x = *x + 3;
printf("In sub program: x = %d\n", *pointer_x);
现在打印正确。但要恢复该值,只需在最后添加此行:
*x = *x - 3;