【发布时间】:2014-05-05 19:47:04
【问题描述】:
这是我在学习期间发现的:
#include<iostream>
using namespace std;
int dis(char a[1])
{
int length = strlen(a);
char c = a[2];
return length;
}
int main()
{
char b[4] = "abc";
int c = dis(b);
cout << c;
return 0;
}
所以在变量 int dis(char a[1]) 中,[1] 似乎什么都不做,也不起作用
全部,因为我可以使用a[2]。就像int a[] 或char *a。我知道数组名是一个指针以及如何传递一个数组,所以我的困惑不是这部分。
我想知道为什么编译器允许这种行为 (int a[1])。还是有其他我不知道的意思?
【问题讨论】:
-
那是因为你实际上不能将数组传递给函数。
-
我认为这里的问题是为什么 C 允许你将一个参数声明为数组类型,而它的行为却完全像一个指针。
-
@Brian:我不确定这是支持还是反对这种行为的论据,但如果参数类型是数组类型的
typedef,它也适用。因此,参数类型中的“指向指针的衰减”不仅仅是用*替换[]的语法糖,它实际上是通过类型系统。这对某些标准类型(例如va_list)具有实际影响,可能使用数组或非数组类型定义。 -
@songyuanyao 您可以使用指针:
int dis(char (*a)[1])在 C(和 C++)中完成一些不完全不同的事情。然后,传递一个指向数组的指针:dis(&b)。如果你愿意使用 C++ 中不存在的 C 特性,你也可以说void foo(int data[static 256])和int bar(double matrix[*][*])之类的东西,但这完全是另一回事。 -
@StuartOlsen 关键不是哪个标准定义了什么。关键是为什么定义它的人这样定义它。