指针
本质:指针本身就是一个变量,存放的其他变量的地址,用解引用符(*)来访问该对象
特点:
- 指针在定义时可以不进行初始化操作,并且可以设置为空指针
int* p1; //正确,定义一个指针 但不进行初始化
int* p2 = NULL; //正确,定义一个空指针
- 指针在初始化后可以改变指向
int a;
int b;
int* p = &a;
p = &b; //正确,将变量b的地址赋值给指针p,改变指针的指向
- 指针可以有多级,即指向指针的指针
int a;
int* p1 = &a;
int** p2 = &p1; //正确,p2指针存放的是p1指针的地址
- 当把指针作为参数传递时,形参和实参是两个不同的变量,形参是指针变量,实参是原本的变量
void swap(int* p1,int* p2) {
int temp = *p2;
*p2 = *p1;
*p1 = temp;
}
int main() {
int a=10;
int b = 20;
swap(&a, &b);
cout << "a=" << a << "b=" << b;
}
引用
本质:引用是为变量起另一个名字。在编译器内部是通过指针来实现的
特点:
- 引用在声明的时候必须进行初始化,并且不能为NULL
int a=10;
int& A; //错误
int& A = a; //正确
- 引用初始化后不能改变
- 引用 使用取地址符(&)得到的是引用所指变量的地址
int a=10;
int& A = a;
cout << "&a=" << &a << endl;
cout << "&A=" << &A << endl;
//两者地址相同
- 而引用作为参数传递时,形参和实参 实质上是同一个变量
总结
- 指针是一个变量,里面存放的是地址
- 而引用则跟原来的变量实质上是同一个东西,它只是原变量的别名
- 指针可以有多级
- 而引用只有一级
- 指针的声明和定义可以分开执行,并且可以设置为空指针
- 而引用在声明的时候必须进行初始化,并且不能为NULL
- 指针在初始化后可以改变指向
- 而引用初始化后不能改变
- 对指针使用取地址符(&) 得到的是指针原本的地址
- 而引用得到的是引用所指变量的地址
- 当把指针作为参数传递时,形参和实参是两个不同的变量
- 而引用作为参数传递时,形参和实参 实质上是同一个变量