2015-02-19 3 views
0

У меня есть простой тестовый код для Функция Pointer:Функция указатель

void PrintHello(char *name) 
{ 
    printf("Hello %s\n", name); 
} 
int main(int argc, const char * argv[]) 
{ 
    //ptr is a function pointer 
    void (*ptr)(char*); 

    ptr = PrintHello; 
    ptr("world"); 

    return 0; 
} 

Код сборки & успешно работать. Распечатывается строка «Hello world».

Но, что я не понимаю, функция PrintHello(char*) принимает указатель на строку в качестве аргумента. Но мой код вызывает эту функцию через Функциональный указательptr("world"), в котором я прямо передал строку «мир» функции, а не указатель на строку. Почему это работает?

+0

Это указатель на 'char', а не указатель на строку – blgt

+1

' char * 'не является указателем *** на строку ***. _' "hello" '_ на самом деле является' const char * '. SO, возможно, не лучшее место для изучения основ C++ BTW. –

+0

Также обратите внимание, что строковый литерал становится 'const char *', а не 'char *'. Вы избегаете этого, потому что вы являетесь компилятором, являющимся снисходительным (это использование обычно было обычным явлением, поэтому компиляторы могут его поддерживать, хотя это не является строго законным). – BoBTFish

ответ

4

В строковых литералах типа С. char []. Передача строкового литерала в функцию означает, что вы передаете указатель на первый элемент строки, который имеет тип char *. Вызов функции

ptr("world"); 

эквивалентно

char name[] = "world"; 
ptr(name);   // Name decays to pointer to first character of the string literal. 

Следует отметить, что строковые литералы не являются изменяемыми и, следовательно, "world" в ptr("world");, но это не относится к char массивов.

В C++ строковые литералы имеют тип const char []. Это означает, что функция ptr должна иметь параметр const char * вместо char *. (const char [] будет распадаться до const char *).

+0

Строка std :: string C++ имеет автоматическое преобразование из "(const) char *" в std :: string. – haavee

1

функция PrintHello (символ *) принимает указатель на строку

Нет, это не делает. Он принимает указатель на char.

Но мой код вызывает эту функцию через указатель функции

Это не имеет значения, прохождение WRT Аргументы на всех.

Я сразу передал строку "мир" в функции

Вы не сделали. Вы передали литерал, который совпадает с передачей указателя на первый элемент (char* в C, const char* на C++).

Почему это работает?

Как уже упоминалось, факт, вызванный функцией через указатель функции, не имеет значения. Таким образом, он работает как обычный вызов. При этом в C++ незаконно передавать строковый литерал в функцию, принимающую неконстантный указатель.

+2

Объясните нижний план. –

+0

Привет, я думал, что в C "указатель на строку" это то же самое, что и "указатель на символ", поскольку строка - это массив символов. Не могли бы вы прояснить это? Благодарю. BTW, я не спустил вас вниз, это не я :) –

+0

@ Leem.fin это то, что вы получаете для смешивания двух разных языков в одном вопросе. Это, как говорится, я уверен, что строковые литералы в C все еще являются строковыми литералами. –

Смежные вопросы