C++指针与引用小结

C++

C++还是比较难的。。。如果有理解错误,请一定不吝赐教。

C++的指针与引用

指针

指针其实就是一个变量,只不过它存储的是一个地址,
其实我个人感觉真正别扭的是,定义q的时候常规思路上是 *q = &a ,q应该是a的地址,但是实际上存储地址的是变量q, 而q是索引地址所代表的值的。明白这一点,指针就应该没大问题了。

int a = 10;
int * q = &a;
// 打印q 与*q 
cout << q << endl; // 0x61fe14
cout << *q << endl; // 10

const修饰指针

这里面个人感觉主要是看const的位置
第一种情况:
修饰整个int指针,那么这个指针索引到的值,在指针存储的地址不变时,不可发生改变,但是当你给它赋新的地址时,也可以顺便修改指针地址所索引的值。

int a = 10;
const int * q = &a;// 这里修饰的是整个int型的指针
cout << *q ; //10
//*q = 20;
int b = 20;
q = &b;
cout << *q; // 20

黑马程序员
图片来源黑马程序员
那么这种情况有啥用呢,当你传入消息时,如果只是用值传递,那么会产生拷贝现象,会占用大量资源,那么我们进行函数运算的时候,考虑使用地址传入,但是地址传入的时候,会修改地址所索引的值,那么使用const int * q,这样的传入,即满足了地址传递的效果,又不会使原数据进行修改,就满足了需求。
那有意思的来了,如果在函数里面,进行地址重新指向,原有的值会发生改变么?
下面我们发现在函数中修改了,指针的索引,却并没有使主函数中的值有更改。

void test(const int *q){
    int a = 200;
    q = &a;
}
int main(){
    int a = 10;
    int *q = &a;
    test(q);
    cout << *q << endl;
    int b = 20;
    q = &b;
    cout << *q << endl;
}
// 输出
10
20
  • 这里的个人理解:在函数中传入指针,然后在函数中修改指针指向,并不能影响函数外的指针实际的指向,就好比在函数外传入变量值,不能修改函数外的变量的值,因为会拷贝值,在栈区的另一个位置开辟内存存储变量,与main函数中的实参变量没有实际上的联系,而且这区域的变量会在局部函数结束之后释放内存。值得注意地是main函数也是一种局部函数。
  • 当传入地址时,即可对变量的值操作,个人理解是因为传入地址或者指针之后,与值类型,同样拷贝,但是该变量存储地确实地址,即可以通过该地址指向实参变量,这样对于指针修改及引用地修改即可改变原实参地值,那么有意思的是由此可用套娃理论,在函数内需要传入指针的指针,才能修改指针的指向。
    但是这里修改完指向之后,却无法修改原指针所指向的变量的值,因为指针的指针的指向的是指针的地址,将指针的指针修改之后,指针即对原指向的变量失去控制。
void  test(int **q){
    *q = new int(200);

}
int main(){
    int a = 10;
    int *q = &a;
    int **q1 = &q;

    test(q1);
    cout << a << endl;
    cout << *q << endl;
    int b = 20;
    q = &b;
    cout << *q << endl;

第二种情况:
const 修饰的p,p存储的是地址,那么地址不可以改,即所指向的变量地址不可以改,但是该指向变量的值可以改,


int a = 10;
int b = 20;
int * const p; // 指针常量
// p = &b;
*p = 20;

引用

引用的实质就是就是上述指针的第二种情况。

int a = 10;
int &c = a;
c =20;
//c = &b;

当我们将const 添加到引用之前,就是防止误操作,

const int & a;
const int * const a; 
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页