首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数参数为c和c++的大小数组的用途是什么?

函数参数为c和c++的大小数组的用途是什么?
EN

Stack Overflow用户
提问于 2021-04-12 11:41:15
回答 2查看 153关注 0票数 2

考虑以下职能:

代码语言:javascript
运行
复制
void func1(int unsized_array[]){}
void func2(int sized_array[10]){}
void func3(int *pointer){}

根据下列结果:

代码语言:javascript
运行
复制
    std::cout << std::is_same<decltype(func1), decltype(func2)>::value << std::endl;
    std::cout << std::is_same<decltype(func2), decltype(func3)>::value << std::endl;
    std::cout << std::is_same<decltype(func3), decltype(func1)>::value << std::endl;

这三个函数的类型是相同的。在函数func2中,sizeof运算符也不提供数组元素的大小。

那么,大小数组作为函数参数的目的是什么(比如func2)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-12 11:54:28

  1. ,因为数组声明器通常都有大小表达式(比如在参数中定义数组以外的数组,或者声明包含数组作为子部分的参数(例如指向数组的指针)时,将数组排除在语法之外要花费更多的工作,而不是将其放在无害的位置。(C中有许多可以导致无效的构造,例如没有副作用的语句表达式(3*4;)、没有副作用的逗号表达式的左操作数、空体的函数或循环等等。需要做大量工作才能将没有影响的东西排除在语言之外。)

参数中的

  1. 数组大小在static关键字出现时确实会改变含义;void func2(int asd[static 10])声明一个函数,该函数必须传递一个指向至少十个元素中的第一个元素的指针,这与其他声明的含义不同。(这将使从数组参数声明的语法中排除大小表达式的问题更加复杂,因为有必要禁止裸大小,但不禁止使用static.)

对于函数实现者和函数用户来说,数组大小可能是有用的文档。

  1. 数组大小被计算。例如,如果定义为void func2(int asd[printf("Hello")]) {},则在调用函数时将打印“Hello”。(有些编译器可能不会这样做;C标准对此并不清楚。)

  1. 编译器可以使用size表达式来发出警告,如果它看到函数使用的元素的数量超过了指定的数量,或者调用者传递的数量少于指定的数量。(Clang 11似乎不做前者,也不做后者,除非使用static。)

票数 5
EN

Stack Overflow用户

发布于 2021-04-12 11:57:40

没有目的,因为他们都腐烂到相同的类型,正如你正确地识别。对于C++,此行为是从C继承的。

就像将const添加到非引用参数和其他关键字不会将任何内容更改到外部一样,它们都会导致void(int)签名。

代码语言:javascript
运行
复制
void foo1(int a) {}
void foo2(const int a) {}
void foo3(volatile int a) {}

但是,与int[10]不同,您可以使用一些实际工作的东西:

代码语言:javascript
运行
复制
void func2(int(&asd)[10]) {}

这将只接受大小为10的int数组。您现在还可以使用sizeof在编译时获得数组大小,显然int[10]不可能这样做。

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

https://stackoverflow.com/questions/67057724

复制
相关文章

相似问题

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