zoukankan      html  css  js  c++  java
  • C++引用和指针比较 指针常量和常量指针

    1.定义一个指针的时候可以不赋初始值,定义一个引用的时候必须有初始值。

     int *x;//不报错
     int &y;//报错
     
    2.对于程序员来说指针变量包含两部分一个是指针指向的地址和指针本身自己的地址,所以可以对指针再进行取地址&。
    对程序员来说引用变量只能获取它所指向的变量的地址,而无法获取引用变量本身的地址,它本身的地址由编译器进行支配。
    int a = 5;
    int *x = &a;
    int &y =a;
    std::cout<<x<<std::endl;//x指针指向的地址
    std::cout<<&x<<std::endl;//x指针本身自己的地址
    std::cout<<&y<<std::endl;//引用变量指向的地址
    std::cout<<y<<std::endl;//引用变量指向的地址中存储的值,这里是5
     
    3.引用的地址我们无法获取,所以不能定义指向引用的指针。但是可以定义指向指针的引用
    int a = 5;
    int* &p = &a;//这里定义了一个int指针类型的引用p,让p引用指向int类型的变量a的地址。
     
    4.指针声明后它所指向的地址是可以改变的。
    int a = 5;
    int *x = &a;
    std::cout<<x<<std::cendl;
    int b = 6;
    x = &b;
    std::cout<<x<<std::cendl;//两次打印的x指针指向的地址是不一样的
    变量声明后它所指向的地址是不变的。这点上类似于指针常量
    int a = 5;
    int &y = a;
    std::cout<<&y<<std::cendl;
    int b = 6;
    y = b;
    std::cout<<&y<<std::cendl;//两次打印的y引用指向的地址是一样的,改变的是y引用指向的这个地址中存储的值
     
    5.常量指针和指针常量
    (1)常量指针表示不可以通过这个指针来修改它所指向的地址所保存的值,但是可以通过原变量修改,可以修改这个常量指针指向的地址,它的声明方式是const在*之前如:const int * a;或者int const * a;
    如果要声明一个指向常量的指针则必须将该指针声明为常量指针
    int a = 5;
    int b = 10;
    const int * x = &a;
    a = 7;//不报错,可以通过原变量修改变量的值,原变量a不是一个const 修饰的变量
    *x = 6;//报错,因为x是一个常量指针,它指向地址中存储的值不能改变
    x = &b;//不报错,可以改变常量指针指向的地址
    (2)指针常量表示不可以修改指针指向的地址,但是可以修改它指向的地址中所保存的值,它的声明方式是const在*之后,如:int * const x;
    int a = 5;
    int  * const x = &a; 
    a = 6 ;
    *x = a;//不报错,可以修改指针常量所指向的地址中保存的值
    x =&a;//报错,不允许修改指针常量指向的地址
  • 相关阅读:
    ecshop 整合 kindedotor
    css 一些小笔记
    linux 使用 随记录
    GIPZ 压缩
    js 代码 随记
    map和list循环遍历
    向数据库批量处理事件
    链表和数组的优劣比较
    内存对齐 和 sizeof小结
    C++的默认构造函数与构造函数
  • 原文地址:https://www.cnblogs.com/maycpou/p/14452339.html
Copyright © 2011-2022 走看看