2014-10-17 3 views
0

Опять же, я наткнулся на какое-то упражнение, в котором я не могу понять некоторые основные линии, которые сказали, что я не могу понять, как некоторые вещи работают. Я знаю указатели, но иногда мне кажется, что у меня все еще нет базового знания.Указатели как аргументы функции

В чем смысл использования указателей в следующем примере (в аргументах функции и сравнении данных строкового типа с данными типа символа, как указано в функции с именем: InsertPerson).

Позволь мне сказать так, что у нас есть следующий код:

struct SPerson 
{ 
    string name; 
    string surname; 
    int age; 
}; 

priority_queue<SPerson, vector<SPerson>, FunkyFunctor> SuperPQ; 

// ** THIS IS THE BIT OF CODE WHICH I'M HAVING PROBLEM WITH 

void InsertPerson(SuperPQ &kp, const char *name, const char *surname, int age) 
{ 
    SPerson newPerson; 
    newPerson.name = name; 
    newPerson.surname = surname; 
    newPerson.age = age; 

    kp.push(newPerson); 
} 

int main(void) 
{ 
    SuperPQ superQUEUE; 


    InsertPerson(superQUEUE, "Jeremy", "Clarkson", 54); 

} 

Почему мне нужны указатели в качестве аргументов функции в функции, вызываемой InsertPerson, почему я не могу использовать эти переменные вместо их указатели?

Спасибо заранее за вежливость и любой легко понять объяснение;)

Ура!

+4

вы можете заставить его принять 'const std :: string & name, const std :: string & surname' – Creris

ответ

2

Строковый литерал, то есть "hello" имеет тип «массив n const char» (§ 2.14.5/8). В некоторых случаях массивы называются decay указателям на их первый элемент. Поэтому const char не подходит для принятия аргумента, который ожидает строковый литерал. Как упоминалось @Creris, потому что ваши данные являются std::string с, вам не нужно использовать const char* и вместо этого вместо них можно заменить const std::string&.

0

Массив должен быть передан указателем в C и C++. Это потому, что аргументы функции - это только одиночные значения, а массивы и структуры - несколько значений.

Так как указатель представляет собой одно значение, он может передаваться там, где не может быть нескольких значений. Он указывает на эти структуры или массивы.

На уровне машинного кода это связано с тем, что соглашения о вызовах функций имеют только места в регистре или стек для отдельных значений.

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