使用指针模拟具有简单功能的按引用传递但没有输出

时间:2018-10-03 16:50:33

标签: c function pointers printf pass-by-reference

我引用了以下问题:

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;
}

1 个答案:

答案 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));