The concept of "reference semantics" is an abstract, theoretical one, meaning that you have a way for a function to modify existing data in place by giving that function a reference to the data.
The question is whether reference semantics can be implemented by a language. In C, you can obtain reference semantics by using pointers. That means you can obtain the desired behaviour, but you need to assemble it yourself from various bits and pieces (pointer types, address-of operators, dereference operators, passing pointers as function arguments ("by value")).
By contrast, C++ contains a native reference type and thus implements reference semantics directly in the language.
Other languages have different approaches to this, for example, in Python many things are references by default (and there's a difference, say, between a = b
and a = b[:]
when b
is a list). Whether and how a language provides reference vs value semantics is a profound part of the language's design.