検索

ホームページ  >  に質問  >  本文

c++ - 关于const的一个问题

1.void a(const int arr[], int n);
arr既然作为一个形式参数,退化为一个指针,指向数组第一个元素,那为什么const还是作用于整个数组,而不仅仅是第一个元素

大家讲道理大家讲道理2774日前399

全員に返信(5)返信します

  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:43:29

    1. 从编译器的角度来解释,编译器不允许const指针赋值给非const指针,因此可知const指针不能隐式转换为非const指针。

    2. 由1知,const指针q加上任意常数n,即q+n仍然为const指针类型(因为const指针允许本身发生移动或者改变,即q=q+n是允许的),而q[n]=*(q+n),因此一个const指针访问的整个数组都是不可修改的只读的值。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 13:43:29

    const int 限定的是数组元素的类型,表示元素的值只读,所以是整个数组。其实 const 只是语法限定只读,实际内存数据仍然可写。 arr 还是一个指针变量,可以赋值,但只能指向 const int 类型的地址。
    使用强制类型转换,仅为演示,不建议乱用强制转换,除非自己清楚。
    参考代码如下:

    void al(const int arr[])
    {
           const int* const pci = arr;
        arr = pci;     // 可以
        // pci = arr;  // 不可以, 因为 const pci
        //*pci = 3;       // 不可以, 因为 const int*
    
        // arr[0] = 0; // 不可以
    
        // C 可以, 编译警告
        // C++ 不可以
        // int *pa = arr; 
        // pa[0] = 9;  
    
        const int *p = &arr[0];
        arr = p;
        printf("arr[0]: %d\n", arr[0]);
    
        const int i = 7;
        printf("i: %d\n", i);
        
        void *pvi = (void *) &i;
        int  *pi  = (int *) pvi;
        // printf("*pi: %d\n", *pi);
        *pi = 5;
    
        printf("i: %d\n", *pi);
    }
      
    

    返事
    0
  • PHPz

    PHPz2017-04-17 13:43:29

    这里的Const确保函数内这个指针指向不变,始终指向数组首地址以及这个地址只读

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 13:43:29

    你在使用的时候不会只让指针指向数组第一个,constant只限定不会通过指针修改指针所指向的内存,ok

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 13:43:29

    赞同天下无圣的答案,const有效因为const指针运算后返回的还是const指针。贴一个小测试代码

    void f(const int arr[])
    {
      std::cout << "type(arr): " << typeid(arr).name() << std::endl;
      std::cout << "type((arr)): " << typeid((arr)).name() << std::endl;
      std::cout << "type(arr+1): " << typeid(arr+1).name() << std::endl;
      int *p;
      std::cout << "type(p): " << typeid(p).name() << std::endl;
      std::cout << "type((p)): " << typeid((p)).name() << std::endl;
      std::cout << "type(p+1): " << typeid(p+1).name() << std::endl;
    
    }

    下面是结果。PKi是指向const int的指针

    type(arr): PKi
    type((arr)): PKi
    type(arr+1): PKi
    type(p): Pi
    type((p)): Pi
    type(p+1): Pi

    返事
    0
  • キャンセル返事