Regardless of provided convenience of references over pointers such as needleless of dereferencing and rules specific to use of each ,
is there any logical reason to provide two language constructs as pointers and references or is it just a syntactic sugar?
You are asking two questions, if I understand correctly
foo(reintepret_cast<int *>(0xDEADBEEF) );. In contrast, a reference ensures that the underlying data is valid - since the reference is an alias the the object itself and can't be moved from being so (providing the the referenced object is still in scope - edited per remark below).
NULL). The second reason is that one can be sure that not only is the data pointing to a valid location, it is also pointing at a valid data object. But the main reason is that a reference allows us to enjoy the benefit of calling a function without passing arguments by value, yet still maintaining a guarantee that the argument refers to a valid value.