《程序员面试宝典》C/C++指针

4.4指针
4.4.1指针和引用
(1)指针是存放变量地址的一个变量,它可以被改变,其所指向的地址也可以被改变,而引用知识一个别名,在逻辑上不独立,具有依附性,在一开始就必须被初始化,引用的对象在整个生命周期内是不能被改变的。
(2)按值传递,指针传递和引用传递
1)按值传递是完全复制一个与原数据同样的数据,包括复制了数据和指针两个数据,对复制品操作完全不影响原数据。就好比一对双胞胎,不仅复制了大脑(数据),还复制体型(指针),打娘胎出来两个是完全一样的。但是在这之后其中任一个人大脑学习知识都不会影响另一个人大脑。

int i = 10;
int j = i;

这里写图片描述
2)指针传递是复制了一个原始数据的地址,复制的地址和原始地址指向同一个数据,而数据还是一个。还好比一对双胞胎,但是很不幸,这是对连体双胞胎,共同拥有一个大脑(数据)但体型(指针)有两个,因此任一个人通过大脑学习知识必然影响另一个人大脑。

int i = 10;
int *j = &i;

这里写图片描述
3)引用就更加简单了,只是单纯的起个别名,并没有复制任何数据,就比如一个人,你省份证可以是萍萍,别人也可以喊你贝贝,相当于你一个人有两个名字。

int i;
int &j = i;

这里写图片描述
(3)引用在使用的时候不需要解引用(*),而指针需要解引用
(4)引用只有在定义的时候被初始化一次,之后不能再引用其他量。
(5)引用不可以为空,而指针可以为空。给一个人起别名,这个人一定是存在的
下面举几个例子:

    int i = 10;
    int *a = &i;
    int * & p = a;
    int b = 8;
    p = &b;
    cout << "p:" << p << endl;//00B9F820
    cout << "&p:" << &p << endl;//00B9F838
    cout << "*p:" << *p << endl;//8
    cout << "* & p:" << *& p << endl;// 00B9F820
    cout << "* * & p:" << **& p << endl;//8
    cout << "*a:" << *a << endl;//8
    cout << "a:" << a << endl;// 00B9F820

这段代码很有意思,需要注意的是p = &b,所以p是一个地址,& p取址后必然也是地址,int * & p = a所以* & p(等于a的地址)还是地址,所以* * & p=*a=8。p = &b,p是指向b的地址,所以*p=8。
下列引用是非法的:

int &b[3];//不能建立引用数组
int & *p;//不能建立指向引用的指针
int &&r;//不能建立引用的引用

4.4.2指针与数组
未完待续。。。

猜你喜欢

转载自blog.csdn.net/wangshuailpp/article/details/79937402