考虑以下代码:
void Increment(int *arr) {
    arr++;
}
int main() {
    int arr[] = {1,2,3,4,5};
    // arr++  // illegal because its a const pointer
    Increment(arr);   // legal
}我的问题是,如果arr是一个常量指针,为什么我可以把它发送给一个没有接收常量指针的函数呢?
代码编译时不会出现丢弃常量限定符的警告。
发布于 2010-10-01 21:34:37
不要被指针所蒙蔽。同样的道理也适用于普通int:
const int a = 42;
int b = a; // How can I assign a const int to a non-const int?
int c = 4; // Come to think of it, the literal 4 is a constant too
void foo (int x) { std::cout << x; }
foo(a); // How come I can call foo with a const int?总之,const分别应用于每个对象。const对象的副本也不需要是const。
发布于 2010-10-01 21:25:00
我的问题是,如果arr是一个常量指针,为什么我可以把它发送给一个没有接收常量指针的函数呢?
?
arr (在main()中)不是常量指针,它是一个数组。数组类型在传递给函数时会衰减为指针类型。
Increment中的arr (参数)保存参数arr (通过main()的值传递)地址的副本。
// arr++ // ileagal,因为它是一个常量指针
这是非法的,因为arr是不可修改的lvalue。
发布于 2010-10-01 21:29:40
你不能在main中增加int arr[]的原因是因为它是不可修改的左值。该标准说:
可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有常量限定类型,如果它是结构或联合,则没有任何成员(递归地包括所有包含的聚合或联合的任何成员或元素)具有常量限定类型。
增量运算符++需要一个可修改的左值(在它修改时)。然而,Increment函数中的指针是一个可修改的左值(它不是数组类型,它是一个指针),这就是为什么它在那里是合法的。
https://stackoverflow.com/questions/3839553
复制相似问题