我引用了以下问题:
Using pointers to emulate Pass-by-Reference in a Pass-by-Value function (C and C++)
我正在尝试一个非常类似的练习,除了没有实现一个“交换”函数,而是试图实现一个计算整数的立方的函数。对我来说,令人困惑的是,我根本没有任何输出,甚至没有“ hello world”测试输出。实际上,我得到的只是以下内容:
process exited after 1.967 seconds with return value 3221225477
我的代码如下:
#include <stdio.h>
#include <stdlib.h>
int cube1(int *p);
int cube2(int a);
int main(int argc, char *argv[])
{
int x;
int *q;
x = 3;
*q = &x;
//output test
printf("hello world\n");
printf( "x = %d\n", x );
printf( "q = %p\n", q );
printf("%d cubed using variable passing by reference = %d\n", x, cube1(x));
printf("%d cubed using variable passing by value = %d\n", x, cube2(x));
system("pause");
return 0;
}
//simulated pass by reference
int cube1(int *p)
{
int temp = *p;
temp = temp*temp*temp;
*p = temp;
return *p;
}
//standard pass by value
int cube2(int a)
{
return a*a*a;
}
答案 0 :(得分:1)
如果使用指针模拟按引用传递,则必须将指针传递给函数,而不是变量。 *q = &x;
应该是q = &x;
,函数调用应该是cube1(&x)
或cube1(q)
。
但是,即使您这样做,由于要调用cube1(&x)
,因为它会修改x
,并传递x
作为参数,而之间没有序列点,因此您将调用未定义的行为。没有保证的评估顺序。
例如在我的系统上,它输出我:
27 cubed using variable passing by reference = 27
27 cubed using variable passing by value = 19683
为避免这种情况,您应该在两个单独的语句中打印x
和函数的返回值:
printf("%d cubed using variable passing by reference = ", x);
printf("%d\n", cube1(&x));
printf("%d cubed using variable passing by value = %d\n", x, cube2(x));