Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 219
  • Last Modified:

Addresses and pointers galore...

Hi guys,
   I have a few question that I am not very sure bout.
Q1. What is the diff between a function like:
   a) char MyFunction (....)
 and
   b) char &MyFunction(...)
 What should it return in case a) and b)?
  I think that a) should return a char object while
   b) should return a pointer to a char object...
  cause a pointer to the address (as in b) is actualy the real value ( in this case, the char ).Am I right?

Second question:
Q2. I have seen Functions with parameter (datatype *&varname,...)
.. why do we need '*&'?  What should we pass in ? I think that we should pass in a object( and never a pointer ) because a pointer to the address of the object is simply the object (value) itself. Am I right again?

Thanks cause I am trying to understand pointers/addresses which I feel is quite complex to me...

David Chong
0
Haho
Asked:
Haho
  • 3
  • 3
1 Solution
 
chensuCommented:
Q1. Yes, you're right. Let's take an example. I am not sure if you can read Intel 80x86 assembly language. In MyFunction1(), the value of ch is returned. In MyFunction2(), the address of ch is actually returned.

1:    char MyFunction1()
2:    {
00401000   push        ebp
00401001   mov         ebp,esp
3:        static char ch = 'a';
4:        return ch;
00401003   mov         al,[___xt_z(0x0040c030)+0Ch]
5:    }
00401008   pop         ebp
00401009   ret
6:
7:    char &MyFunction2()
8:    {
0040100A   push        ebp
0040100B   mov         ebp,esp
9:        static char ch = 'a';
10:       return ch;
0040100D   mov         eax,offset ___xt_z(0x0040c034)+10h
11:   }
00401012   pop         ebp
00401013   ret
12:
13:   int main()
14:   {
00401014   push        ebp
00401015   mov         ebp,esp
00401017   sub         esp,8
15:       char ch1 = MyFunction1();
0040101A   call        MyFunction1(0x00401000)
0040101F   mov         byte ptr [ch1],al
16:       char ch2 = MyFunction2();
00401022   call        MyFunction2(0x0040100a)
00401027   mov         al,byte ptr [eax]
00401029   mov         byte ptr [ch2],al
17:
18:       return 0;
0040102C   xor         eax,eax
19:   }
0040102E   mov         esp,ebp
00401030   pop         ebp
00401031   ret


Q2. It means that varname is a reference of datatype * type. The pointer is a reference. You should pass a variable of datatype * type. For example,

datatype *pdat = ...;
Func(pdat);

The value of pdat may be changed in Func().
0
 
HahoAuthor Commented:
hi chensu ,
   I would like to ask something for Q2.
You said ' varname is a reference for datatype *type. I am not sure bout this statement. Does it mean that this parameter is a usual (datatype *varname ) but the value is passed by reference??
If I change varname's value, will this change be reflected outside of this function (similar to call by value) ??
Can u perhaps explain it a bit more clearly as I am not a pointer expert... :)

Any comments from the rest would be great! Thanks!

David Chong
0
 
chensuCommented:
>Does it mean that this parameter is a usual (datatype *varname ) but the value is passed by reference??

Yes.

>If I change varname's value, will this change be reflected outside of this function (similar to call by value)?

Yes.

For example,

void func1(int *pn)
{
    *pn = 2;
    pn++;
}

int n = 1;
int *pn = &n;
func1(&n);
// n == 2 at this point
n = 3;
func1(pn);
// pn == &n, no change.
// n == 2 at this point


void func2(int *&pn)
{
    *pn = 2;
    pn++;
}

int n = 1;
int *pn = &n;
func2(pn);
// pn == &n + 1, changed.
// n == 2 at this point

0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
HahoAuthor Commented:
hi chensu,
   one more final question... :)
   So does this mean that if I want to design a function that accepts a pointer to a data type as a parameter AND I want this pointer's value to change ( call by value - similar), I would use '*&' and if I want call by reference , I would use the usual "datatype * varname" parameter..???

Thanks! Just reaffirming what u have tought me ..

David
0
 
chensuCommented:
Yes. A pointer is nothing more than a data type. If you use something like void func1(int *pn), the content pointed to by pn can be changed. If you use something like void func2(int *&pn), the content pointed to by pn can be changed and the pointer itself can also be changed.
0
 
HahoAuthor Commented:
thanks!!!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 3
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now