指针返回内存地址?

时间:2014-05-17 07:09:41

标签: c pointers memory-address return-type

我正在使用扫描主程序中的数字的程序。之后,该程序调用函数change_number(),并作为参数给出数字内存地址。在此程序之后,应在子程序中将数字加3,然后在子程序中打印出来并恢复该新值。但是,当尝试在子程序change_number()中输出数字时,它会打印出它的内存地址。我的理解是程序应该在引用带有* -notation的指针时或仅通过插入变量名称时返回整数值。我尝试过的另一个编译器会出现以下错误消息,甚至无法使用x -notation或* pointer_x -notation进行编译:

  • "您正在尝试将变量初始化为错误类型的值。 code.c:20:警告:从不兼容的指针类型"。
  • 分配

我不明白,因为我的指针是作为整数引入的,就像整数本身一样。这是代码:

#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);

}

3 个答案:

答案 0 :(得分:1)

您已粘贴的代码无法在pointer_x = &x;行编译,因为xpointer_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;