«Указатель на первый элемент массива» — распространенная конструкция. Его использует каждая строковая функция, включая функции stdio, которые вводят и выводят строки. main использует его для argv.
«Указатель на массив» — редкая конструкция. Я не могу найти его применения в стандартной библиотеке C или POSIX. grepping все заголовки, которые я установил локально (для '([^)]*\*[^)]) *\['
), я нахожу ровно 2 законных экземпляра указателя на массив, один в libjpeg и один в gtk. (Оба являются членами структуры, а не параметрами функции, но это не относится к делу.)
Итак, если мы придерживаемся официального языка, у нас есть редкая вещь с коротким именем и похожая, но гораздо более распространенная вещь с длинным именем. Это противоположно тому, как естественно хочет работать человеческий язык, поэтому возникает напряжение, которое разрешается во всех ситуациях, кроме самых формальных, с помощью короткого имени «неправильно».
Причина, по которой мы не говорим просто «указатель на указатель», заключается в том, что есть еще одно распространенное использование указателей в качестве параметров функции, в котором параметр указывает на один объект, который не является членом массива. Например, в
long strtol(const char *nptr, char **endptr, int base);
endptr
— это точно такой же тип, как argv
в main
, оба являются указателями, но используются по-разному. argv
указывает на первый char *
в массиве char *
s; внутри main вы должны использовать его с такими индексами, как argv[0]
, argv[optind]
и т. д., или проходить через массив, увеличивая его с помощью ++argv
.
endptr
указывает на один char *
. Внутри strtol
бесполезно увеличивать endptr
или ссылаться на endptr[n]
для любого значения n
, отличного от нуля.
Это семантическое различие выражается в неформальном использовании «argv — указатель на массив». Возможная путаница с тем, что означает «указатель на массив» на формальном языке, игнорируется, потому что естественный инстинкт использовать краткий язык сильнее, чем желание придерживаться формального определения, которое говорит вам не использовать самую очевидную простую фразу, потому что она зарезервирована. для ситуации, которая почти никогда не произойдет.
person
Community
schedule
22.06.2013