[SOLVED] Is C language call by reference?

Issue

This Content is from Stack Overflow. Question asked by GT K

I know that there is no Call by reference in C language.
but, Some people say that there is a Call by reference in C.
I’m confused.

As far as I know, when handing over the factor to the function in C, I know that the value transferred to the function is received by making a local copy as a parameter.

However, in C++, “Call by reference” is possible because “the same element that differs only from the factor and name” is created by the reference “&”. Is that true?



Solution

I know that there is no Call by reference in C language.

Correct. C always passes by value.

Some people say that there is a Call by reference in C. I’m confused.

They are wrong. This is very easy to test.

Let’s start by looking at this small Perl program.

use 5.014;

sub f {
   $_[0] = 456;   # $_[0] is the first argument.
}

my $x = 123;
f( $x );
say $x;   # 456

Changing the parameter changed the argument. This is an example of pass by reference. Perl arguments are passed by reference.

Now let’s do the same thing in C.

#include <stdio.h>

void f( int x ) {
   x = 456;
}

int main( void ) {
   int x = 123;
   f( x );
   printf( "%d\n", x );   // 123
}

Changing the parameter had no effect on the argument. This is an example of pass by value. C’s arguments are passed by value.

You can use pointers to achieve a similar result.

#include <stdio.h>

void f( int *xp ) {
   *xp = 456;
}

int main( void ) {
   int x = 123;
   f( &x );
   printf( "%d\n", x );   // 456
}

Note that the argument (the pointer) is still passed by value. Changing xp itself (as opposed to *xp) has no effect on the caller.

Same goes for arrays. The degenerate into a pointer which is passed by value.

#include <stdio.h>

void f( char a[] ) {
   a = "def";
}

int main( void ) {
   char a[] = "abc";
   f( a );
   printf( "%s\n", a );   // abc
}

This could be called passing a reference. It is not passing by reference, however.


However, in C++, "Call by reference" is possible

Correct.

C++ normally uses pass by value.

#include <iostream>

using namespace std;

void f( int x ) {
   x = 456;
}

int main( void ) {
   int x = 123;
   f( x );
   cout << x << endl;   // 123
}

But pass by reference can be requested using &.

#include <iostream>

using namespace std;

void f( int &x ) {
   x = 456;
}

int main( void ) {
   int x = 123;
   f( x );
   cout << x << endl;   // 456
}


This Question was asked in StackOverflow by GT K and Answered by ikegami It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?