В C char *
представляет указатель на непрерывную последовательность символов. Непрерывная последовательность символов с нулевым окончанием - это то, что мы называем строкой в C.
char **
является указателем на непрерывную последовательность строк, и, поскольку каждая строка является непрерывной последовательностью символов, оканчивающихся нулевым ('\ 0') символом, char **
представляет непрерывную последовательность для непрерывной последовательности символы, оканчивающиеся нулем.
Ваша декларация:
char str[12] = "Hello there";
Объявляет str
массивом символов длиной 12 и инициализируется 12 символами {'H','e','l','l','o',' ','t','h','e','r','e','\0'}
. Это совместимо с параметром в foo (), но не с bar
и baz
, которые ожидают непрерывную последовательность указателей на строки. Вот почему эти двое выдают вам предупреждение компилятора, потому что параметр несовместим с аргументами, передаваемыми в.