zoukankan      html  css  js  c++  java
  • int *const && int const * && const int *的区别

    ANSIC允许声明常量,常量和变量不同,常量就是不可以改变的量,用关键字const来修饰

    比如:const int a

       int const a

    以上两种声明方式是一样的,我们不需要考虑const和int的先后顺序,按照你理解的方便的一中方式进行应用。

    因为const和int的顺序先后并不影响结果,因此 int const *   &&  const int *这两中情况就是一样的

    所以我们只需要讨论两种情况

    ------------------------------------------1:int const *ptr

    我们说过const int a;就是声明一个int型的常量,而int * ptr;是声明一个int型的指针变量,因此终上所述int const *ptr就是生命一个指向整形常量的指针,我们可以修改指针的值,但是不可以修改*ptr的值,也就是指针所指向的值;

     1 #include<stdio.h>
     2 int main(){
     3     int a=10;
     4     int b=20;
     5     int  const * p1=&a;
     6     //(*p1)=12;   我们可以修改指针的值,但是不能修改他所指向的值
     7     p1=&b;
     8     printf("%d
    ",*p1);
     9     b=30;
    10     printf("%d
    ",*p1);
    11     return 0;
    12 }

    上面的程序中,p1的值可被修改,可以指向另一个变量的地址,但是(*p1)的值不可以被修改了

    首先const  修饰的是整个*pi(注意,我写的是*pi而不是pi)。所以*pi是常量,是不能被赋值的(虽然pi所指的b是变量,不是常量)。 其次,pi前并没有用const 修饰,所以pi是指针变量,能被赋值重新指向另一内存地址的。

    ------------------------------------------2:int * const ptr

    #include<stdio.h>
    int main(){
        int a=10;
        int b=20;
        int  * const  p1=&a;
        printf("%d
    ",*p1);
        (*p1)=12;  
        //p1=&b;    // 我们可以修改他所指向的值,但是不能修改指针的值
        printf("%d
    ",*p1);
        
        return 0;
    }

    我们这里const修饰的p1,p1的值不能改变,但是我们可以改变他所指向的值

    p1有了const的修饰,变成了一个指针常量,不能被修改

    整个*p1没有被const修饰,所以*p1是变量,而不是常量

    -----------------------------》3转换问题

     1 #include<stdio.h>
     2 int main(){
     3 
     4     const int n=10;
     5     int *p;
     6     p=(int *)&n;
     7     printf("%d
    ",*p);
     8     *p=12;
     9     printf("%d
    ",*p);
    10     return 0;
    11 }
    情况一:int * pi指针指向const int n常量的情况 
    const int n=10; 
    int *p; 
    p=&n;//这样可以吗?不行,VC下是编译错。const int 类型的n的地址是不能 
             //赋值给指向int 类型地址的指针p的。否则p岂不是能修改n的值了吗! 
    p=(int* ) &n;  // 这样可以吗?强制类型转换可是C所支持的。 
    //VC下编译通过,但是仍不能通过*p=80来修改n的值。去试试吧!看看具体的怎样

    情况二:const int * p指针指向const int n的情况 
    const int n=40; 
    const int * p; 
    p=&n;//两个类型相同,可以这样赋值。n的值无论是通过p还是n都不能修改的。 

    情况三:用const int * const p申明的指针 
    int n; 
    const int * const p=&n; 
    //你能想象p能够作什么操作吗?p值不能改,也不能通过修改n的值。因为不管是 
    //*p还是p都是const的
  • 相关阅读:
    opengl 4.5离线文档下载
    c++下利用URLOpenStream下载
    实时阴影渲染(三):软阴影深度校正
    实时阴影渲染(二):软阴影
    实时阴影渲染(一):PSSM平行分割阴影图
    Ogre材质shader模版
    本地springboot项目连接本地mysql报错。com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
    Caused by: java.lang.IllegalStateException: AnnotationAwareAspectJAutoProxyCreator is only available on Java 1.5 and higher
    关于布隆过滤器
    CSS系列------选择器和选择器的优先级
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/5582534.html
Copyright © 2011-2022 走看看