Опять же, я наткнулся на какое-то упражнение, в котором я не могу понять некоторые основные линии, которые сказали, что я не могу понять, как работают некоторые вещи. Я знаю указатели, но иногда мне кажется, что у меня все еще нет базового знания.
В чем смысл использования указателей в следующем примере (в аргументах функции и сравнении данных строкового типа с данными типа char, как указано в функции с именем: 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, почему я не могу использовать эти переменные вместо своих указателей?
Заранее благодарю за вежливость и любое легкое для понимания объяснение;)
Ура!
Строковый литерал, т.е. "hello"
имеет тип "массив из n const char" (§ 2.14.5/8). В некоторых случаях массивы, как говорят, распадаются на указатели на их первый элемент. Поэтому const char
не подходит для принятия аргумента, который ожидает строковый литерал. Как упоминалось в @Creris, поскольку ваши члены данных являются std::string
s, вам не нужно использовать const char*
и вместо этого вместо них заменить const std::string&
.
Массив должен быть передан указателем в C и C++. Это потому, что аргументы функции - это только одиночные значения, а массивы и структуры - несколько значений.
Так как указатель - это одно значение, он может быть передан там, где не может быть нескольких значений. Он указывает на те структуры или массивы.
На уровне машинного кода это связано с тем, что соглашения о вызовах функций имеют только места в регистре или стеке для одиночных значений.
const std::string& name, const std::string& surname