指针:
1.指针的本质
就是一个地址,就一个整型数,无论各种类型,它就是一个地址。
不同类型的指针只是方便编程,改变指针的类型不会改变对应地址所存放的内容
n位机器,则无论何种指针,其大小都是n位
2.指针的使用:
*p:逆向使用指针
int a=10;
int b=20;
int* p; // 整型指针
p=&a; // 指针P中存放着变量a地址
cout<<p<<endl; // 输出指针P所指的地址,也就是a地址
cout<<*p<<endl; // 根据指针p的地址进行查找,并输出所存放的数据,也就是a
(*p)++;//对a进行操作
p=&b;
(*p)++;//对b进行操作
3.指针作为函数的参数:
注意指针就是一个存放着地址的变量,那么作为参数时,其实就是将该指针所指的地址****拷贝到函数的形参指针中而已。
本质是传递一个值
在函数中,修改形参所指的地址,不会改变实参所指的地址。与传入基本数据类型变量一样。
但可以通过形参指针,修改对应地址中所存放的数据
void f1(int* p){
*p=20; // 主函数中的a会被修改
}
void f2(int* p){
int a=30;
p=&a; // 只是形参所指的地址改变,但实参所指地址不改变
}
int main(){
int a=10;
int* p=&a;
f1(p);
cout<<*p<<endl;// 20
f2(p);
cout<<*p<<endl;// 依然为20
}
4.双指针
也就是指针的指针,双指针指向某个指针所在的地址
int a=10;
int* p;
int** q=&p; // q指向p的地址
*q=&a// 由于q指向p的地址,则*q=&a 会修改 p的内容
cout<<*p<<endl; // 会输出a的值
引用:
1.引用的本质:
引用不是变量,只是变量的引用(或者别名),对引用进行操作,相当于对变量直接进行操作。
内存不会为引用创建新的变量,只会存在所引用的变量
一旦确定引用的变量,之后就不能修改
2.引用的使用:
int a=10;
int b=20;
int& p=a;// 对a或p进行操作,效果一样
p=b; // p还是引用a,相当于 a=b;
3.引用作为函数的参数:
传递的是所引用的变量的地址
void f1(int& p){
p++;// p就是a的引用,相当于a++
}
int main(){
int a=10;
f1(a);
}
4. 与指针的区别:
1.指针可以指向空,但引用不能指向空,必须引用已经存在的变量
2.对指针所指地址的数据进行操作需要进行解指针(*p),而引用这可以直接修改
int a=10;
int* p=&a //要取地址
int& q=a //不用取地址
*p=15; //需要解
cout<<a<<endl;
q=20; // 直接进行操作,就可修改a
cout<<a<<endl;