What are the differences between a pointer variable and a reference variable in C++?
来源:互联网 发布:获取网页限制数据 编辑:程序博客网 时间:2024/05/19 22:04
Question:
I know references are syntactic sugar, so code is easier to read and write.
But what are the differences?
Summary from answers and links below:
- A pointer can be re-assigned any number of times while a reference can not be re-seated after binding.
- Pointers can point nowhere (
NULL
), whereas reference always refer to an object. - You can't take the address of a reference like you can with pointers.
- There's no "reference arithmetics" (but you can take the address of an object pointed by a reference and do pointer arithmetics on it as in
&obj + 5
).
To clarify a misconception:
The C++ standard is very careful to avoid dictating how a compiler must implement references, but every C++ compiler implements references as pointers. That is, a declaration such as:
int &ri = i;
if it's not optimized away entirely, allocates the same amount of storage as a pointer, and places the address of i into that storage.
So, a pointer and a reference both occupy the same amount of memory.
As a general rule,
- Use references in function parameters and return types to define useful and self-documenting interfaces.
- Use pointers to implement algorithms and data structures.
Interesting read:
- My alltime favorite C++ FQA lite.
- References vs. Pointers.
- An Introduction to References.
- References and const.
A pointer can be re-assigned:
int x = 5;int y = 6;int *p;p = &x;p = &y;*p = 10;assert(x == 5);assert(y == 10);
A reference cannot, and must be assigned at initialization:
int x = 5;int y = 6;int &r = x;
A pointer has its own memory address and size on the stack (4 bytes on x86), whereas a reference shares the same memory address (with the original variable) but also takes up some space on the stack. Since a reference has the same address as the original variable itself, it is safe to think of a reference as another name for the same variable. Note: What a pointer points to can be on the stack or heap. Ditto a reference. My claim in this statement is not that a pointer must point to the stack. A pointer is just a variable that holds a memory address. This variable is on the stack. Since a reference has its own space on the stack, and since the address is the same as the variable it references. More on stack vs heap. This implies that there is a real address of a reference that the compiler will not tell you.
int x = 0;int &r = x;int *p = &x;int *p2 = &r;assert(p == p2);
You can have pointers to pointers to pointers offering extra levels of indirection. Whereas references only offer one level of indirection.
int x = 0;int y = 0;int *p = &x;int *q = &y;int **pp = &p;pp = &q;//*pp = q**pp = 4;assert(y == 4);assert(x == 0);
Pointer can be assigned NULL directly, whereas reference cannot. If you try hard enough, and you know how, you can make the address of a reference NULL. Likewise, if you try hard enough you can have a reference to a pointer, and then that reference can contain NULL.
int *p = NULL;int &r = NULL; <--- compiling error
Pointers can iterate over an array, you can use
++
to go to the next item that a pointer is pointing to, and+ 4
to go to the 5th element. This is no matter what size the object is that the pointer points to.A pointer needs to be dereferenced with
*
to access the memory location it points to, whereas a reference can be used directly. A pointer to a class/struct uses->
to access it's members whereas a reference uses a.
.A pointer is a variable that holds a memory address. Regardless of how a reference is implemented, a reference has the same memory address as the item it references.
References cannot be stuffed into an array, whereas pointers can be (Mentioned by user @litb)
Const references can be bound to temporaries. Pointers cannot (not without some indirection):
const int &x = int(12); //legal C++int *y = &int(12); //illegal to dereference a temporary.
This makes
const&
safer for use in argument lists and so forth.
- What are the differences between a pointer variable and a reference variable in C++?
- What are the differences between a pointer variable and a reference variable in C++?
- What are the differences between struct and class in C++?
- What’s the difference between a class variable and an instance variable?
- What are the differences between HDMI versions 1.1, 1.2, 1.3a, 1.4a and 2.0?
- What is the difference between a soft reference and a weak reference in Java?
- The difference between declaring a variable “id” and “NSObject *”
- What's the difference of name scope and a variable scope in tensorflow?
- What's the difference of name scope and a variable scope in tensorflow?
- What are the practical differences between SVD and wavelet transforms in data analysis?
- What Are the Differences Between Smaller Couriers and FedEx-_899
- What are the differences between LDAP and Active Directory?
- What are the differences between nil, NULL and [NSNULL nil]?
- What are the Differences between Work Package and Planning Package?
- What are the differences between numpy arrays and matrices
- What are the differences between Apache Kafka and RabbitMQ?
- [Python]--What are the differences between numpy arrays and matrices?
- the difference between pointer and array (and variable)
- ACCESS 日期函數 常用函數
- android应用开发全程实录-你有多熟悉listview?
- IOS学习步骤
- servlet前端jsp,遇到一个奇葩问题
- Android ADB端口被占用问题解决方法
- What are the differences between a pointer variable and a reference variable in C++?
- 钩子模式 HooK 模板方法模式
- android 内存溢出解决集锦
- 单片机读取EEPROM(AT24C02)
- 批处理
- Android中Acition和Category常量表
- oracle不能显示中文
- 云计算走进垂直时代,巨头已分领域进入
- 依赖注入