Це те, що я виявив під час свого навчання:
#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[*][*])
, але це зовсім інша банка глистів.