Вот что я обнаружил в период обучения:
#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]). Или у него есть другие значения, о которых я не знаю?
typedefс типом массива. Так что «распад на указатель» в типах аргументов не просто синтаксический сахар заменить []с *, это действительно происходит через систему типа. Это имеет реальные последствия для некоторых стандартных типов, подобных тому, va_listкоторые могут быть определены с типом массива или не-массивом.
int dis(char (*a)[1]). Затем передать указатель на массив: dis(&b). Если вы хотите использовать функции C, которых нет в C ++, вы также можете говорить такие вещи, как void foo(int data[static 256])и int bar(double matrix[*][*]), но это совсем другая баня червей.