【问题标题】:how to pass the pointer to a function and assign the value to the variable pointed to in C?如何将指针传递给函数并将值分配给C中指向的变量?
【发布时间】:2013-10-30 01:57:00
【问题描述】:

我知道 c 总是按值传递,但如果我有一个指针:

int  i = 4;
int * p;
p = &i;

那么我有一个函数,如何将指针p 传递给它并更改变量i 的值?

void changeValue(int *p)
{
}

如何传递指针并改变p指向的变量?

【问题讨论】:

  • “我知道c总是按值传递”你怎么知道的?
  • 感谢您的热线好友。我不知道。我的意思是我知道,根据经验,一切都被复制了,甚至是指针的值,但从未考虑过。

标签: c pointers pass-by-value


【解决方案1】:

这个简单的例子展示了如何传递一个指针(即不是一个值)并通过该指针接收整数持有的新值。请注意变量数量的减少。即不必创建int *p; 的单独副本。在这种情况下也没有必要将 p:p = &i; 初始化为 i 的地址。

int changeValue(int *);
int main(void)
{
    int i=15;
    changeValue(&i);
    return 0;
}

int changeValue(int *p) //prototyped to accept int *
{
    return *p = 3;  
}

如果您确实想首先创建一个指针并传递该指针,那么:

int changeValue(int *);
int main(void)
{
    int i=15;
    int *p;
    p = &i;
    *p; // *p == 15 at this point
    //since p is already a pointer, just pass
    //it as is
    changeValue(p);
    return 0;
}

int changeValue(int *q) //prototyped to accept int *
{
    return *q = 3;  
}

请务必注意,您的陈述:I know the c always pass by values 不正确。将函数编写成传递指针更为常见,因为通常指针更小,传递比实际变量更有效,尤其是在使用大型数组或结构时。请记住,如果需要传递指针,则传递 &i(i 的地址)与传递 p 一样有效。

【讨论】:

    【解决方案2】:

    只需调用changeValue作为传递它

    changeValue(p);  
    

    并通过将值分配给changeValue()中的*p来更改它所指向的变量的值(i)

    void changeValue(int *p)  
    {
         *p = an int value;
    }
    

    【讨论】:

      【解决方案3】:
      void changeValue( int* ) ;
      
      int main( void )
      {
          int  i = 4; // Suppose i is stored at address 1000h
          int * p;    
          p = &i;     // Now p stores the address of i that is 1000h
      
          changeValue(p); // Can also be written as changeValue(&i);
          // Here you are passing the address of i to changeValue function
      
          return 0 ;
      }
      
      void changeValue( int* p ) // Accept a parameter of type int*
      {
          *p = 100 ; // store the value 100 at address 1000h
          return ;
      }
      

      【讨论】:

      • 如果一个函数的第一次出现在 C 中没有首先定义一个特定的返回类型,即返回类型不明确,编译器假定它将返回 int。这样changeValue(p); 第一次出现在main 中,因为它不明确,编译器假定int。然后在函数定义中定义为void changeValue(int *)。这会导致重新声明函数编译时错误。如果您在main() 之前的某处添加原型void changeValue(int *);,您的代码就完美了。 (我不是反对者,但如果解决了,我会赞成)
      • @alk :: 我的错误。我匆匆回答了这个问题。
      • @ryyker :: 绝对正确。感谢您指出这一点。
      • @ryyker :: 谢谢好友 :-)
      【解决方案4】:
      int  i = 4;
      int * p = &i;
      changeValue(p);
      printf("%d",*p);
      
      void changeValue(int *p)
      {
          *p = 5;
      }
      

      完整程序 - http://ideone.com/DCvhxE

      【讨论】:

      • 为什么不将您链接到答案中的这个简短(且正确)的示例代码?它陈述的答案不正确,因为它错过了原型changeValue()。
      【解决方案5】:

      如果您取消引用changeValue 中的指针并将其分配给它,它将改变调用框架中i 的值。

      例如:

      void changeValue(int *p)
      {
          *p = 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        • 2017-08-09
        • 2019-10-19
        相关资源
        最近更新 更多