C vs. C++: Pass by value and reference

Recently I was reading insertion in a linked list in C and C++.
(Assuming that reader has some knowledge of basic coding of linked list)
If start pointer is passed in the function then double pointer is used in C and in C++, & is used to change start pointer(double pointer can also be used in C++, as C++ has many features of C).
C:

void insert(struct node** start, int val)
{
    ... //do something
    *start = somethingNew;
}
... //function will be called as
insert(&start);

C++:

void insert(struct node*& start, int val)
{
     ... //do something
     start = somethingNew;
}
... //function will be called as
insert(start);

By closely observing, it can be seen that in C there is nothing like passing by reference. C will always copy the argument(s) that will be passed to functions. In the above case(of C), the reference to start pointer is copied and the changes are done that will remain even after the function exits with respect to start node(extra: changes to the reference of start won’t be accounted outside). While C++ is genuine here, when it uses ampersand, it passes that object by reference and changes it.

To make it clear, lets take the case of insertion somewhere in the list, in that case the node after which some new node is to be inserted is passed to the function, in both languages single pointer does the job, Why?

void someFunction(struct node* someNode)
{
     someNode->data = 1;
     someNode->link = NULL;
     //someNode = someNewValue;
}

When some pointer is passed to this function, then copy of the address is made and when someNode->data (extracted as *someNode.data) is executed then the address would be dereferenced first, and data value is changed (similar for someNode->link).  Third line, if decommented, won’t make any difference outside this function (still not making any difference) as the copied address will change only.