c++ - 关于const的一个问题
大家讲道理
大家讲道理 2017-04-17 13:41:29
0
5
402

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(5)
伊谢尔伦
  1. 从编译器的角度来解释,编译器不允许const指针赋值给非const指针,因此可知const指针不能隐式转换为非const指针。

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

左手右手慢动作

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);
}
  
PHPzhong

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

小葫芦

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

左手右手慢动作

赞同天下无圣的答案,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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan