Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Modify a variable passed by reference

Tags:

c++

reference

I'm working on a function that finds the smallest element in an array. I'm trying to modify the variable s using pass by reference. I'm brand new to C++ and I'm not sure if I have done pass-by-reference correctly. Can anyone confirm that this is the correct way to do this, or suggest better ways to approach a min value function with pass by reference?

#include <cstdlib>
#include <stdlib.h>
#include <iostream>

using namespace std;

int smallestElm(int numArray[], int length, int &smallest);

int main() {

    int n[3] = {2,5,3};
    int s = 0;
    int length = 0;

    cout << smallestElm(n, length, s) << endl;
}

int smallestElm(int numArray[], int length, int &smallest) {
    smallest = numArray[0];
    length = sizeof (numArray) / sizeof (int);
    for (int i = 1; i < length; i++) {
        if (numArray[i] < smallest) {
            smallest = numArray[i];
        }
        cout << smallest << endl;
        return 0;

    }
}
like image 547
the_martian Avatar asked Oct 15 '25 22:10

the_martian


2 Answers

Yes this is correct, as you should be able to tell by yourself, by modifying your main function like this:

int main() {
    int s = 0;    
    // call your function
    cout << s << endl; // Here you print 's', thus you confirm whether you are right or not
}

If s wouldn't change its value, then your pass by reference won't be correct (since s does change its value inside the body of the function).


As for the function, it's wrong, since it will return before checking all the elements! So, change that to something like this to check all the elements of the array before saying for certain which the smallest element is:

#include <stdlib.h>
#include <iostream>

using namespace std;

void smallestElm(int numArray[], size_t length, int &smallest);

int main() {

    int n[] = {2,5,3}; // size is not needed, it's automatically computed by the compiler
    int s = 0;
    size_t length = 3;

    smallestElm(n, length, s);
    cout << "smallest element = " << s << endl;
    return 0;
}

void smallestElm(int numArray[], size_t length, int &smallest) {
    smallest = numArray[0];
    for (int i = 1; i < length; i++) {
        if (numArray[i] < smallest) {
            smallest = numArray[i];
        }
        cout << smallest << endl;
    }
}

Output:

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
2
2
smallest element = 2

Don't forget that STL provides min_element, that you could use like this:

#include <algorithm>
#include <iostream>

using namespace std;

int main() {

    int n[] = {2,5,3};
    int *s = std::min_element(n, n + 3); // 3 size of the array
    cout << "smallest element = " << *s << endl;
    return 0;
}

Output:

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
smallest element = 2
like image 120
gsamaras Avatar answered Oct 18 '25 11:10

gsamaras


Can anyone confirm that this is the correct way to do this

Yes, that is the correct way to declare a reference argument. And yes, you can modify objects through a reference.

or suggest better ways to approach a min value function ...

A better way would arguably be to return the min value, instead of modifying an argument. Right now the function always returns 0, which seems useless.

... with pass by reference

That's a silly idea, but your approach is correct way to pass by reference. The function itself has multiple bugs.

  • It seems to always return after the first iteration, so it'll always find one of the first 2 element to be "smallest".
  • The value of int length argument is never used. It is overridden before use.
  • sizeof (numArray) returns the size of the pointer numArray which is not in any way related to the size of the pointed array.
  • The function always uses numArray[0] so it will have undefined behaviour if length == 0.
like image 32
eerorika Avatar answered Oct 18 '25 10:10

eerorika



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!