1.void a(const int arr[], int n);
arr既然作为一个形式参数,退化为一个指针,指向数组第一个元素,那为什么const还是作用于整个数组,而不仅仅是第一个元素
伊谢尔伦2017-04-17 13:43:29
从编译器的角度来解释,编译器不允许const指针赋值给非const指针,因此可知const指针不能隐式转换为非const指针。
由1知,const指针q加上任意常数n,即q+n仍然为const指针类型(因为const指针允许本身发生移动或者改变,即q=q+n是允许的),而q[n]=*(q+n),因此一个const指针访问的整个数组都是不可修改的只读的值。
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);
}
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