2015-05-19 2 views
0

Это очень начинающий вопрос, но я заметил, что некоторые C-функции имеют вид:C/C указатели ++ в/в функции

int* foo(int *N){...} 

Может кто-то:

а) объяснить, что int * foo означает? В одной такой функции нет return.

b) объяснить, насколько гибким является int * N? Я знаю, что это означает, что аргумент является указателем на int, но из того, что я понимаю из рассмотрения одной из таких функций, это означает, что функция foo может фактически принимать векторные аргументы. Для меня это не имеет смысла.

+5

Я начал отвечать, но я думаю, для а) вы действительно должны изучить основы C и/или C++. Что касается b), то это одна из опасных зон C и C++: указатель может представлять множество разных вещей. Обычно вы можете избежать этого на C++ с лучшими абстракциями (в основном пользовательскими типами из стандартной библиотеки.) – juanchopanza

+0

Я изучил некоторые C, но, глядя на определенную программу, вы задали несколько вопросов. В частности, я никогда не думал, что «int * N» может означать, что N * может быть векторным аргументом. Это главное. Первый вопрос может быть из-за того, что мне был предоставлен багги код, но в аналогичном коде нет оператора возврата. – Lepidopterist

+0

У меня есть книга «Язык программирования C» Кернигана и Ричи. Похоже, что это не касается этого случая. – Lepidopterist

ответ

4

а) объяснить, что int* foo средства? В одной из таких функций нет инструкции return.

Это означает foo это функция, которая возвращает указатель на int. Если такая функция не имеет оператора return, вызов этой функции приведет к неопределенному поведению.

От стандарта C++:

6.6.3 return заявление

...

стекания конец функции эквивалентно возврату без значения; это приводит к неопределенному поведению в возвращающей значение функции.

б) объяснить, насколько гибкими int *N это?

Это зависит от реализации foo. Ниже приведены синтаксически действующие способы вызова foo. Они семантически действительны, зависит от foo.

int a; 
int b[10]; 
int* c = new int; 
int* d = new int[20]; 

foo(&a); 
foo(b); 
foo(c); 
foo(d); 
foo(nullptr); 
+0

Спасибо за ответ, но веб-сайт является равным, надавив на меня, чтобы удалить его. – Lepidopterist

+0

Это зависит от вас. Не беспокойся. –

+0

@ Lepidopterist: Это всего лишь безумное поведение определенного «эксперта», не помнящего, откуда взялись их знания. Они видят «простой вопрос» и нажимают «downvote», иногда даже без чтения. Ваш вопрос и ваш принятый ответ должны быть на первой странице независимо от серьезной публикации о C или C++. Не обращайте внимания на глупых людей. Просто проходите и идите! –

2

int* foo(int *N) - это функция, которая принимает указатель, этот указатель указывает на хотя бы один int, но, возможно, на массив целых чисел, C немного неаккуратно по этому поводу.

{ 
    int n = 0; 
    foo(&n); 
} 

или, может быть,

{ 
    int a[17]; 
    foo(a); 
} 
+0

Спасибо, что ответили на мое замешательство. Я думаю, что другой вопрос может быть вызван ошибкой кода. Мне сложно объяснить код, потому что это чей-то частный код, и мой вопрос мотивирован моей попыткой заставить его работать. – Lepidopterist

2

В этом примере foo является указателем на функцию, принимающую один аргумент, целочисленный указатель и возвращающий int. Это как если бы вы объявляли функцию под названием «* foo», которая принимает целочисленный указатель и возвращает зацепку; теперь, если * foo - функция, то foo должен быть указателем на функцию.

Ключ к написанию объявления для указателя функции заключается в том, что вы просто записываете объявление функции, но с (* func_name), где вы обычно просто добавляете имя func_name.