首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数组作为常量指针

数组作为常量指针
EN

Stack Overflow用户
提问于 2010-10-01 21:23:19
回答 8查看 3.5K关注 0票数 6

考虑以下代码:

代码语言:javascript
运行
复制
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是一个常量指针,为什么我可以把它发送给一个没有接收常量指针的函数呢?

代码编译时不会出现丢弃常量限定符的警告。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-10-01 21:34:37

不要被指针所蒙蔽。同样的道理也适用于普通int:

代码语言:javascript
运行
复制
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。

票数 7
EN

Stack Overflow用户

发布于 2010-10-01 21:25:00

我的问题是,如果arr是一个常量指针,为什么我可以把它发送给一个没有接收常量指针的函数呢?

arr (在main()中)不是常量指针,它是一个数组。数组类型在传递给函数时会衰减为指针类型。

Increment中的arr (参数)保存参数arr (通过main()的值传递)地址的副本。

// arr++ // ileagal,因为它是一个常量指针

这是非法的,因为arr是不可修改的lvalue

票数 10
EN

Stack Overflow用户

发布于 2010-10-01 21:29:40

你不能在main中增加int arr[]的原因是因为它是不可修改的左值。该标准说:

可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有常量限定类型,如果它是结构或联合,则没有任何成员(递归地包括所有包含的聚合或联合的任何成员或元素)具有常量限定类型。

增量运算符++需要一个可修改的左值(在它修改时)。然而,Increment函数中的指针是一个可修改的左值(它不是数组类型,它是一个指针),这就是为什么它在那里是合法的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3839553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档