I don’t understand why the output of this code is not 1, 4, 90
. Instead, it is always 1, 4, 83
.
int main()
{
float u = 83;
vector<float> te = {1, 4, u};
u = 90;
cout << te[0] << " " << te[1] << " " << te[2] << "\n";
return 0;
}
I tried adding a pointer, but this did not work:
int main()
{
float u = 83;
float *x = &u;
vector<float> te = {1, 4, *x};
u = 90;
x = &u;
cout << te[0] << " " << te[1] << " " << te[2] << "\n";
return 0;
}
>Solution :
In your first example, when you create the te
vector with the u
value, you are creating a vector containing a copy of the value.
When u
is equal to 83
, doing this:
vector<float> te = {1, 4, u};
creates a vector which includes a copy of the value 83
. It is equivalent to doing:
vector<float> te = {1, 4, 83};
.
In your second example, when you use the asterisk on a pointer, you are dereferencing that pointer. By dereferencing you are no longer referencing the memory location of u
— you are accessing the value it currently holds.
When you dereference x
in the creation of te
, the te
array creates a copy of the value that dereferencing x
provides. At this point in the code, x
points to u
containing 83
. So this:
vector<float> te = {1, 4, *x};
is equivalent to this again:
vector<float> te = {1, 4, 83};
What you would need to achieve what you want to achieve is a vector of pointers. This would provide you the result you are looking for:
int main()
{
float u = 83;
float v = 1;
float w = 4;
float *x = &u;
float *y = &v;
float *z = &w;
vector<float*> te = {y, z, x};
u = 90;
x = &u;
cout << *te[0] << " " << *te[1] << " " << *te[2] << "\n";
return 0;
}
By holding a bunch of pointers in your vector, you can update the values that the pointers are pointing to, and then dereference the pointers held in your array. This would provide you with the current values held in the original u
, v
or w
floats.