1.void a(const int arr[], int n);arr既然作为一个形式参数,退化为一个指针,指向数组第一个元素,那为什么const还是作用于整个数组,而不仅仅是第一个元素
光阴似箭催人老,日月如移越少年。
从编译器的角度来解释,编译器不允许const指针赋值给非const指针,因此可知const指针不能隐式转换为非const指针。
由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); }
这里的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
从编译器的角度来解释,编译器不允许const指针赋值给非const指针,因此可知const指针不能隐式转换为非const指针。
由1知,const指针q加上任意常数n,即q+n仍然为const指针类型(因为const指针允许本身发生移动或者改变,即q=q+n是允许的),而q[n]=*(q+n),因此一个const指针访问的整个数组都是不可修改的只读的值。
const int 限定的是数组元素的类型,表示元素的值只读,所以是整个数组。其实 const 只是语法限定只读,实际内存数据仍然可写。 arr 还是一个指针变量,可以赋值,但只能指向 const int 类型的地址。
使用强制类型转换,仅为演示,不建议乱用强制转换,除非自己清楚。
参考代码如下:
这里的Const确保函数内这个指针指向不变,始终指向数组首地址以及这个地址只读
你在使用的时候不会只让指针指向数组第一个,constant只限定不会通过指针修改指针所指向的内存,ok
赞同天下无圣的答案,const有效因为const指针运算后返回的还是const指针。贴一个小测试代码
下面是结果。PKi是指向const int的指针