Given to functions void main() and void hello(byte* a[4]). Main function has an array of four bytes. The array's reference needs to be passed to the function hello for manipulation. I would expect the right syntax to be:
void hello(byte* a[4]){
// Manipulate array
a[0] = a[0]+1;
}
void main(){
byte stuff[4] = {0,0,0,0};
hello(&stuff);
// hopefully stuff is now equal {1,0,0,0}
}
Alternatively I see others using this form of decaration:
void hello(byte (&a)[4])
Is this the right way to do it?
byte* a[4]
is an array of four pointers tobyte
, except in a parameter list.In a parameter list, it is a pointer to a pointer to a
byte
– i.e. it is equivalent tobyte**
.byte (*a)[4]
is a pointer to a four-element array.byte (&a)[4]
is a reference to a four-element array.In your case,
&stuff
is a pointer to a four-element array, so your parameter should bebyte (*a)[4]
.There are many different options here depending on what you want to do here.
If you have a raw array of
byte
objects, you can pass it into a function like this:The mechanism by which the array is passed into the function (a pointer to the first element of the array is passed to the function) functions similarly to pass-by-reference: any changes you make to
arr
inhello
will stick inmain
even though you didn't explicitly pass in a reference to it. However, thehello
function won't check whether the array has size four or not - it'll take in as input an array of any number of bytes.You can also write
The syntax
byte (&arr)[4]
means "a reference to an array of four bytes." This explicitly passes the array by reference intohello
, and it will check the size of the array to make sure it's correct. However, this is very unusual syntax and rarely seen in practice.But perhaps the best idea is to not use raw arrays and to use
std::array
instead:Now, there's no weirdnesses about strange parentheses in the syntax for arrays of bytes and there's no worries about size checking. Everything is handled properly because
std::array
is an object type that has all the advantages of regular object types. I'd recommend going with this last approach above all the other ones.Arrays are already passed by pointer.
So this:
Is the same as doing this:
Doing this:
only allows arrays with a length of 4 to be passed in.