关于C++指针和引用的和区别对于一个像我一样的初学者来说一直是一件比较头疼的事情,什么是指针?如何使用指针?以及如何正确的理解指针和引用· · ·
定义
首先,指针的定义是什么?通过网上搜索可以了解到指针就是一个地址,而地址就是某个内存位置的一个编号。内存位置里面所储存的数据就是指针所指向的内容。
既然了解了指针的定义,那么如何来使用指针呢?假设我们定义一个变量int x = 10;如何使用指针变量y来获取x的值呢?我们可以使用 int *y = &x;在此有人可能会有疑问,为什么要使用&x,因为指针所指向的是一个地址,所用我们需要使用&x来获取x的地址。
简单了解完了指针的概念之后我们来看一下什么是引用。关于引用的定义其实引用就是另一个变量的别名,就好比我叫瓦尔基里·安德磊,周围人觉得我的名字太长,给我取了个小名叫小磊。所以小磊就是我的一个别名,但本质上来说,这两个都是我。既然如此,我们该如何使用引用呢?同样的,我们定义一个变量int x =10;引用的话就是 int& y = 10;所以当我们改变了y的值,x的值也会随之改变。
指针和引用的区别
那么指针和引用到底有哪些区别呢?
(1)指针不必初始化,因为需要做判空操作,而引用必须初始化,不能为空,就好比一个根本不存在的东西是没办法引用的。
(2)引用只能被初始化一次,之后不可变,而指针可变。
(3)有const指针,却没有const引用,这里的const引用指的是 int &const x;因为这是没有意义的。
(4)”sizeof指针”得到的是指针本身的大小,而”sizeof引用”得到的是所指向的变量(对象)的大小。
(5)指针和引用的自增(++)运算意义不一样,指针的++是内存地址的++,而引用的++是变量本身的++。
(6)引用是安全的,因为多了类型检查,而指针不是。
指针和引用实例
接下来我们通过一个简单例子了解一下指针传参和引用传参。
首先是指针传参:
#includ 大专栏 C++指针和引用e<iostream>
void swap(int* x, int* y) {
int t = 0;
t = *x;
*x = *y;
*y = t;
}
int main() {
int a = 1, b = 42;
std::cout << "Before:a = " << a << " b = " << b << std::endl;
swap(&a, &b);
std::cout << "After:a = " << a << " b = " << b << std::endl;
return 0;
}
输出结果为:Before: a =1 b = 42
After:a =42 b =1
然后是引用传参:
#include<iostream>
void swap(int& x, int& y) {
int t = 0;
t = x;
x = y;
y = t;
}
int main() {
int a = 1, b = 42;
std::cout << "Before:a = " << a << " b = " << b << std::endl;
swap(a, b);
std::cout << "After:a = " << a << " b = " << b << std::endl;
return 0;
}
输出结果为:Before: a =1 b = 42
After:a =42 b =1
const和指针
当const和指针用在一起的时候,不花点心思真的很容易搅浑,所以在此列出一些常见的用法。
常量指针/常指针:const int* p;(等于int const* p;) const在*左边,表示*p为常量,经由*p不能更改指针所指向的内容。
指针常量:int* const p; const在*右边,表示p为常量,经由p不能更改指针所指的方向。
说起来似乎有些拗口,其实简单来说就是const和*哪个在前面就先读谁,const在谁的前面谁就不能改变。还不好理解,那么我们就来举几个例子。
const int x = 42;//常量申明
x = 21;//ERROR,const修饰的常量x的值不能发生改变
int y = 2;
const int* p = &x;//这是一个常量指针/常指针,本质是一个指针,取得x的地址
(*p) = 24;//ERROER,*P为常量,不能通过*P更改指针所指向的内容
int* const r = &y;//这是一个指针常量,本质是一个常量
r = &z;//ERROR,r是常量,其值不可变
*r = 20;//correct
const int* const s = &y;//这是一个常指针常量,表示指针不可改变,指针所指向的值也不能改变
结语
最后引用一下北邮崔毅东教授的一句话:一般来说,能用引用就尽量不要用指针。引用更加直观,更少的出现意外的疏忽导致的错误。 指针有二重、三重之分,比引用更加灵活。有些情况下,例如使用new运算符,只能使用指针。总的来说,自我对于指针和引用的理解还是非常浅显的,在学习的过程中还有很多路要走,希望自己能够再接再厉,共勉。