【问题标题】:Pointer returning memory address?指针返回内存地址?
【发布时间】:2014-05-17 07:09:40
【问题描述】:

我正在使用在主程序中扫描数字的程序。之后,该程序调用函数 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);

}

【问题讨论】:

    标签: c pointers memory-address return-type


    【解决方案1】:

    由于xpointer_x 都是int* 类型,您粘贴的代码应该无法在pointer_x = &amp;x; 行上编译

    在指针变量上使用 address-of 运算符会得到一个指向指针的指针 - 在这种情况下,&amp;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);
    }
    

    【讨论】:

      【解决方案2】:

      参数x已经包含来自main的变量x的地址,所以它必须写成

      void change_number(int *x)
      {
      
        int *pointer_x;
        pointer_x = x;
        *x = *x + 3;
        printf("In sub program: x = %d\n", *pointer_x);
      
      }
      

      【讨论】:

        【解决方案3】:

        当您编写void change_number(int *x) 时,x 将作为int * 接收。所以,x 指向int,而*xint

        因此您需要更改以下内容:

        pointer_x = x;
        *x = *x + 3;
        printf("In sub program: x = %d\n", *pointer_x);
        

        现在可以正确打印了。但是要恢复该值,只需在末尾添加这一行:

        *x = *x - 3;
        

        【讨论】:

          猜你喜欢
          • 2015-12-02
          • 1970-01-01
          • 1970-01-01
          • 2016-03-16
          • 2013-12-22
          • 2011-05-24
          • 1970-01-01
          • 1970-01-01
          • 2020-07-03
          相关资源
          最近更新 更多