我了解到,为了通过调用函数来访问或修改变量的值,我们需要将指针作为参数传递,如下所示:
#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,任何想法为什么?通常地址很长。
答案 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
,则可以将其用作输入,也可以用作输出。