473,413 Members | 1,875 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,413 software developers and data experts.

Arrays that are passed by reference

If I don't specify "ref" in the argument list when passing an array to the
callee, I am passing the array (reference) by value. But this makes me
confused because it actually means a "reference" of a "reference"??As I pass
the array by value, the callee can change that array. However,when I use
ref, the callee and caller point to two different arrays. So could anyone
please explain the 2 different situations?
Jun 12 '07 #1
9 2421
On Jun 12, 11:26 am, "Jack" <j...@knight.comwrote:
If I don't specify "ref" in the argument list when passing an array to the
callee, I am passing the array (reference) by value.
Yes.
But this makes me
confused because it actually means a "reference" of a "reference"??As I pass
the array by value, the callee can change that array.
The callee can change the *contents* of the array.
However,when I use ref, the callee and caller point to two different arrays.
No they don't. Do you have some sample code which makes you think they
do?
So could anyone please explain the 2 different situations?
If you use ref, the callee can change which array the parameter refers
to, and that change will be made to the caller's variable too.

See http://pobox.com/~skeet/csharp/parameters.html for more
information.

Jon

Jun 12 '07 #2
"Jack" <jl@knight.comwrote in message
news:OT**************@TK2MSFTNGP03.phx.gbl...
If I don't specify "ref" in the argument list when passing an array to the
callee, I am passing the array (reference) by value. But this makes me
confused because it actually means a "reference" of a "reference"??As I
pass the array by value, the callee can change that array. However,when I
use ref, the callee and caller point to two different arrays. So could
anyone please explain the 2 different situations?
The array is always passed by reference. When you add the keyword "ref"
you are passing "a reference to the reference". Meaning that when you pass
the array without "ref", the procedure can change the contents of the array,
buy not the array to which the variable is pointing. The latter can be done
if you add "ref".

Jun 12 '07 #3
No; when you use "ref"", the callee and caller *still* point to the
same array. The difference is that in the latter case, if the callee
*re-assigns* the array (i.e. dataArg = new int[5]), then this is
reflected to the caller - i.e. the caller's reference is updated.
Normally this change would be local to the callee, and would not be
reflected to the caller.

For a full discussion, see Jon's pages:
http://www.yoda.arachsys.com/csharp/parameters.html

Marc
Jun 12 '07 #4
It was 404ing... but now it isn't... so ignore me ;-p
Jun 12 '07 #5
On Jun 12, 11:29 am, "Alberto Poblacion" <earthling-
quitaestoparacontes...@poblacion.orgwrote:
If I don't specify "ref" in the argument list when passing an array to the
callee, I am passing the array (reference) by value. But this makes me
confused because it actually means a "reference" of a "reference"??As I
pass the array by value, the callee can change that array. However,when I
use ref, the callee and caller point to two different arrays. So could
anyone please explain the 2 different situations?

The array is always passed by reference.
No it's not. The reference is passed by value by default. There's a
difference between passing a value type value by reference and passing
a reference by value.

See http://pobox.com/~skeet/csharp/parameters.html for more
information.

Jon

Jun 12 '07 #6

"Jon Skeet [C# MVP]" <sk***@pobox.com>
???????:11*********************@j4g2000prf.googleg roups.com...
On Jun 12, 11:26 am, "Jack" <j...@knight.comwrote:
>If I don't specify "ref" in the argument list when passing an array to
the
callee, I am passing the array (reference) by value.

Yes.
>But this makes me
confused because it actually means a "reference" of a "reference"??As I
pass
the array by value, the callee can change that array.

The callee can change the *contents* of the array.
>However,when I use ref, the callee and caller point to two different
arrays.

No they don't. Do you have some sample code which makes you think they
do?
The book is called "C# for experienced programmers"
On page 127-130,
Using system;
....
public class ArrayReferenceTest : System.Windows.Forms.Form
{ ...
private void showOutputButton_Click(
object sender, System.EventArgs e)
{
int[] firstArray = { 1, 2, 3 };

int[] firstArrayCopy = firstArray;

outputLabel.Text = "Test passing firstArray reference by value";

outputLabel.Text = "\n\n Contents of firstArray " + "before calling
FirstDouble:\n\t";

for (int i = 0; i < firstArray.Length; i++)
outputLabel.Text += firstArray[i] + " ";
FirstDouble (firstArray);

outputLabel.Text += "\n\nContents of firstArray after " + "calling
FirstDouble\n\t";
for (int i = 0; i < firstArray.Length; i++)
outputLabel.Text += firstArray[i] + " ";

if ( firstArray == firstArrayCopy )
outputLabel.Text += "\n\nThe references refer to the same
array\n";
else
outputLabel.Text += "\n\nThe references refer to different
arrays\n";

int [] secondArray = { 1, 2, 3 };

int [] secondArrayCopy = secondArray;

outputLabel.Text += "\nTest passing secondArray " +
"reference by reference";

outputLabel.Text += "\nContents of secondArray " +
"before calling SecondDouble:\n\t";

for (int i = 0; i < secondArray.Length; i++ )
outputLabel.Text += secondArray[i] + "\n";

SecondDouble (ref secondArray);

outputLabel.Text += "\n\nContents of secondArray " +
"after calling SecondDouble:\n\t";

for (int i = 0; i < secondArray.Length; i++)
outputLabel.Text += secondArray[i] + " ";

if (secondArray == secondArrayCopy)
outputLabel.Text +=
"\n\nThe references refer to the same array\n";
else
outputLabel.Text +=
"\n\nThe references refer to different arrays\n";

}
void firstDouble (int [] array)
{
for (int i = 0; i < array.Length; i++)
array[i] *= 2;

array = new int[] { 11, 12, 13 };
}

void SeondDouble (ref int[] array)
{
for (int i = 0; i < array.Length; i++)
array[i] *= 2;

array = new int[] { 11, 12, 13 };
}
}
=================================
results:
Test passing firstArray reference by value

Contents of firstArray before calling FirstDouble
1 2 3

Contents of firstArray after calling FirstDouble
2 4 6

The references refer to the same array

Test passing secondArray reference by reference

Contents of secondArray before calling
SecondDouble:
1 2 3

Contents of secondArray after calling SecondDouble:
11 12 13

The references refer to different arrays

============================
Thanks
Jack

>
>So could anyone please explain the 2 different situations?

If you use ref, the callee can change which array the parameter refers
to, and that change will be made to the caller's variable too.

See http://pobox.com/~skeet/csharp/parameters.html for more
information.

Jon

Jun 12 '07 #7
On Jun 12, 11:57 am, "Jack" <j...@knight.comwrote:
However,when I use ref, the callee and caller point to two different
arrays.
No they don't. Do you have some sample code which makes you think they
do?

The book is called "C# for experienced programmers"
On page 127-130,
<snip>

What this shows is that the callee can change the caller's variable's
value. When it says "The references refer to different arrays" is
means "the value of secondArray is different after calling
SecondDouble to the value it had before". It's *not* saying that the
value within the SecondDouble method is different to the value of
secondArray.

Jon

Jun 12 '07 #8
Starting to see some light on the other end after reading your+MS article,
haven't finished it though :)
Thanks
Jack
"Jack" <jl@knight.com¼¶¼g©ó¶l¥ó·s»D:uO*************@TK2MS FTNGP06.phx.gbl...
>
"Jon Skeet [C# MVP]" <sk***@pobox.com>
???????:11*********************@j4g2000prf.googleg roups.com...
>On Jun 12, 11:26 am, "Jack" <j...@knight.comwrote:
>>If I don't specify "ref" in the argument list when passing an array to
the
callee, I am passing the array (reference) by value.

Yes.
>>But this makes me
confused because it actually means a "reference" of a "reference"??As I
pass
the array by value, the callee can change that array.

The callee can change the *contents* of the array.
>>However,when I use ref, the callee and caller point to two different
arrays.

No they don't. Do you have some sample code which makes you think they
do?

The book is called "C# for experienced programmers"
On page 127-130,
Using system;
...
public class ArrayReferenceTest : System.Windows.Forms.Form
{ ...
private void showOutputButton_Click(
object sender, System.EventArgs e)
{
int[] firstArray = { 1, 2, 3 };

int[] firstArrayCopy = firstArray;

outputLabel.Text = "Test passing firstArray reference by value";

outputLabel.Text = "\n\n Contents of firstArray " + "before
calling FirstDouble:\n\t";

for (int i = 0; i < firstArray.Length; i++)
outputLabel.Text += firstArray[i] + " ";
FirstDouble (firstArray);

outputLabel.Text += "\n\nContents of firstArray after " + "calling
FirstDouble\n\t";
for (int i = 0; i < firstArray.Length; i++)
outputLabel.Text += firstArray[i] + " ";

if ( firstArray == firstArrayCopy )
outputLabel.Text += "\n\nThe references refer to the same
array\n";
else
outputLabel.Text += "\n\nThe references refer to different
arrays\n";

int [] secondArray = { 1, 2, 3 };

int [] secondArrayCopy = secondArray;

outputLabel.Text += "\nTest passing secondArray " +
"reference by reference";

outputLabel.Text += "\nContents of secondArray " +
"before calling SecondDouble:\n\t";

for (int i = 0; i < secondArray.Length; i++ )
outputLabel.Text += secondArray[i] + "\n";

SecondDouble (ref secondArray);

outputLabel.Text += "\n\nContents of secondArray " +
"after calling SecondDouble:\n\t";

for (int i = 0; i < secondArray.Length; i++)
outputLabel.Text += secondArray[i] + " ";

if (secondArray == secondArrayCopy)
outputLabel.Text +=
"\n\nThe references refer to the same array\n";
else
outputLabel.Text +=
"\n\nThe references refer to different arrays\n";

}
void firstDouble (int [] array)
{
for (int i = 0; i < array.Length; i++)
array[i] *= 2;

array = new int[] { 11, 12, 13 };
}

void SeondDouble (ref int[] array)
{
for (int i = 0; i < array.Length; i++)
array[i] *= 2;

array = new int[] { 11, 12, 13 };
}
}
=================================
results:
Test passing firstArray reference by value

Contents of firstArray before calling FirstDouble
1 2 3

Contents of firstArray after calling FirstDouble
2 4 6

The references refer to the same array

Test passing secondArray reference by reference

Contents of secondArray before calling
SecondDouble:
1 2 3

Contents of secondArray after calling SecondDouble:
11 12 13

The references refer to different arrays

============================
Thanks
Jack

>>
>>So could anyone please explain the 2 different situations?

If you use ref, the callee can change which array the parameter refers
to, and that change will be made to the caller's variable too.

See http://pobox.com/~skeet/csharp/parameters.html for more
information.

Jon


Jun 12 '07 #9
Key code is this (where "array" may or may not be "ref")
for (int i = 0; i < array.Length; i++)
array[i] *= 2;

array = new int[] { 11, 12, 13 };
When called without "ref", the values in the existing array are
doubled, and then a new unrelated array is created and assigned to
"array" - but the "array" variable and the "firstArray" variable are
unrelated; after the method ends, the caller just sees the original
array reference (whose contents have been doubled).

When called /with/ "ref", the values are doubled as before, and then a
new array is created and assigned (via some pointer dereferencing that
is a little complex) into the variable, but in this case "secondArray"
and "array" are one-and-the-same. The "ref" basically means "don't
create your own variable (on the stack) - use this one instead". So
the values are doubled, but are then discarded in preference for the
new array {11, 12, 13}. As such, at the end of the method the caller
can see the updated reference "secondArray".

The following is also slightly misleading:
int[] firstArray = { 1, 2, 3 };

int[] firstArrayCopy = firstArray;
This is a copy if the variable, /not/ the array (contents).

Marc
Jun 12 '07 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: harry | last post by:
I have 2 multi-dim arrays double subTotals = null; String rowTitles = null; I want to pass them to a function that initialises & populates them like so - loadData( rowTitles, subTotals);
19
by: Canonical Latin | last post by:
"Leor Zolman" <leor@bdsoft.com> wrote > "Canonical Latin" <javaplus@hotmail.com> wrote: > > > ... > >But I'm still curious as to the rational of having type >...
5
by: Gent | last post by:
I have two questions which are very similar: Is it possible to return an object in C++. Below is part of my code for reference however I am more concerned about the concept. It seems like the...
27
by: Mike P | last post by:
I will be passing my function a two dimensional array of varying length. Within that array is one data point, and the number of times it should loop through. So, for example, I might pass this...
1
by: Kurt Richardson | last post by:
Hi all Sorry to bother you with what is probably a really trivial question for you C++ experts. My programming skill are pretty amateur, but I'm pretty good at VB.NET. However, I'm wanting to...
11
by: John Pass | last post by:
Hi, In the attached example, I do understand that the references are not changed if an array is passed by Val. What I do not understand is the result of line 99 (If one can find this by line...
64
by: Zytan | last post by:
I know there are no pointers in C#, but if you do: a = b; and a and b are both arrays, they now both point to the same memory (changing one changes the other). So, it makes them seem like...
11
by: venkatagmail | last post by:
I have problem understanding pass by value and pass by reference and want to how how they are or appear in the memory: I had to get my basics right again. I create an array and try all possible...
8
by: jodleren | last post by:
Hi! I have a function, a part of my code which I can use as a function. It will return 2 arrays, and I am wondering what way to do so. Both arrays hold strings, there are no special keys. 1)...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.