返回值还是将指针传递为参数?

时间:2017-03-21 09:09:30

标签: c

我了解到,为了通过调用函数来访问或修改变量的值,我们需要将指针作为参数传递,如下所示:

#include <stdio.h>

//create a function 
void Increment(int* x) {    
   *x = *x+1;
   printf("Address of variable x in increment = %p\n",x); 

}

int main() {
   int a;
   a = 10;
   Increment(&a);   
   printf("Address of variable 'a' in main = %p\n",&a);
   printf("Value of a in main function = %d\n",a); 


}

但是我做了另一个测试,我发现通过调用函数并返回值,我也可以得到相同的结果。

#include <stdio.h>

//create a function 
int Increment(int x) {        // do not use VOID
   x = x+1;
   printf("Address of variable x in increment = %p\n",x); 
   return x;                  

}

int main() {
   int a;
   a = 10;
       int hasil;
       hasil = Increment(a);   
   printf("Address of variable 'a' in main = %p\n",&a);
   printf("Value of a in main function = %d\n",hasil); 


}

我的问题:

1)如果我只能使用返回值来获得相同的结果,我是否必须将指针作为参数传递?

2)当我打印变量&#39; x&#39;的内存地址时,我会观察到从返回值的函数来看,内存地址非常短0xb,任何想法为什么?通常地址很长。

4 个答案:

答案 0 :(得分:1)

  

1)如果我只能使用返回值来获得相同的结果,我是否必须将指针作为参数传递?

不,你并不总是这样。但是观察到它释放了函数的返回值以进行错误报告。一个非常简单的例子:

enum error_code {
  E_SUCCESS,
  E_GENERAL_FAILURE,
  E_MEMORY_ALLOCATION_FAILED,
  E_INVALID_ARGUMENT,
  E_FILE_NOT_EXIST
};

struct my_important_data {
  // stuff
};

enum error_code fill_important_data_from_file(char const *file_name,
                                              struct my_important_data **data)
{
  if(!data || !file_name)
    return E_INVALID_ARGUMENT;

  *data = malloc(sizeof(**data));

  if(!*data)
    return E_MEMORY_ALLOCATION_FAILED;

  // Return different error codes based on type of failure
  // so the caller can know what exactly went wrong

  return E_SUCCESS;
}
  

2)我观察当我从返回值的函数打印变量'x'的内存地址时,内存地址非常短0xb,任何想法为什么?通常地址很长。

那是因为您使用%p转换说明符来打印常规int,而不是实际地址。严格来说,这导致printf函数具有未定义的行为。

答案 1 :(得分:0)

指针乘法

定义一个乘法函数,它将两个指针变量作为参数,然后返回指针。从主调用这个函数

 #include<iostream>
 using namespace std;

 int *multiply(int *x,int* y)
 {
     int  mul;      
     mul = (*x)*(*y); 
     int *c; 
     c = &mul;        
     return c;            
  }


 int main()
 {

    int x,y;
    x = 4;
    y = 5;
    int *result;         
    result = multiply(&x,&y);
    cout<<*result<<endl;

    return 0;
  }

答案 2 :(得分:-1)

当需要修改数组元素时,需要将指针传递给函数。在C中,您无法传递数组或从函数返回数组。

回答你的第二个问题是,在C函数中,参数是按值传递的。这意味着传递的参数的值被复制到函数的参数(函数的本地参数)。因此传递的参数的地址和函数参数的地址是不同的。

答案 3 :(得分:-1)

如果参数x通过点或引用传递,则不会创建x的值副本。 如果没有,则创建一个副本。这就是区别 想想这种情况,如果参数是复杂的struct test,那么制作test的副本是浪费时间。
如果您逐点传递x,则可以将其用作输入,也可以用作输出。