#c #pointers
#c #указатели
Вопрос:
Мне нужна небольшая помощь в использовании указателей в C . Извините, что кажусь новичком, но я действительно не совсем понимаю их. Я прочитал руководство по указателям на cplusplus.com веб-сайт, поэтому, пожалуйста, не предлагайте этого.
По сути, у меня есть переменная, которая содержит имя другой переменной, и я хочу получить доступ к этой переменной через переменную-держатель. Я считаю, что мне нужно использовать указатели, поправьте меня, если я ошибаюсь.
Например.
int a;
string b;
a = 10;
b = "a";
Мне нужно получить доступ к переменной «a» через содержимое переменной «b».
Просто чтобы представить это в лучшей перспективе, вот как я это использую:
int a;
a = 20;
void getVar(string name) {
cout << name;
}
getVar("a");
Но, как вы можете видеть, в пятой строке это просто приведет к значению name, в данном случае «a», но я хочу, чтобы это приводило к значению переменной, которая содержит name, поэтому я хочу, чтобы она выводила «20».
Любая помощь здесь была бы высоко оценена.
Комментарии:
1. Есть языки, которые делают то, что вы хотите сделать, но C не является одним из них.
2. Да, я знаю, что могу сделать это на PHP, есть ли вообще какой-нибудь способ добиться этого, необязательно с помощью указателей, просто самый простой способ?
3. Почему бы вам не рассказать нам, чего вы пытаетесь достичь, обращаясь к переменной таким образом?
Ответ №1:
Если вам нужно связать имя со значением, рассмотрите ассоциативные массивы, иначе известные как словари и карты. В стандартной библиотеке шаблонов есть std::map
, которые вы можете использовать для сопоставления текста со значением:
#include <map>
#include <string>
std::map<std::string, int> my_map;
my_map["A"] = 20;
cout << my_map["A"] << endl;
Ответ №2:
То, о чем вы думаете, называется (отражение), которое C не поддерживает. Однако вы можете использовать указатели для доступа к тому, что находится в переменной, на которую оно указывает:
int a = 5; //int variable that stores 5
int *b = amp;a; //int pointer that stores address of a
(*b) = 10; //stores 10 into address that b points to (a)
cout << a; //prints 10
Ответ №3:
То, чего вы пытаетесь достичь, невозможно на скомпилированном языке (не учитывая отражение). Вы могли бы выполнить нечто подобное, используя структуру данных map.
theMap["a"] = 20;
и соответствующий
void getVar(string key){
cout << theMap[key];
}
это может быть вызвано с
getVar("a");
Обратите внимание, что в этом чрезвычайно простом примере карта должна находиться в области видимости функции, как в классе или пространстве имен.
Если вы используете указатели, вы просто используете уровень косвенности, совсем не подходящий для вашего примера. Смотрите, например, ответ Chads.
Комментарии:
1. 1 Карта — это то, что я собирался предложить, но мне было слишком лениво вводить ее.
Ответ №4:
У вас нет реального способа получить доступ к переменным по имени подобным образом, если вы не создадите какой-нибудь класс контейнера, у которого есть элемент name, по которому вы просматриваете. Хотя я не уверен, какое это имеет отношение к указателям.
Ответ №5:
То, о чем вы просите, называется «отражение» или «самоанализ» — возможность использовать имена времен разработки для объектов вашей программы (классы, переменные, функции и т.д.) Во время выполнения. C не поддерживает это «из коробки» — имена во время разработки удаляются при компиляции.
В C есть некоторые библиотеки, которые предоставляют такую возможность; но есть также языки, где отражение является частью языка. Например, Python или JavaScript.
Ответ №6:
Может быть, это могло бы вам подойти:
int a = 5;
class b {
public:
b(int amp;x) { ref_ = x; }
int operator()(void) { return ref_; }
private:
int amp;ref_;
}
b my_b(a);
my_b() /* -> 5 */;
Ответ №7:
Ваш код не использует указатели. вы пытаетесь преобразовать строку в идентификатор и распечатать ее результат, я не знаю, возможно это или нет. Если вы намеревались использовать pointer, ваш код должен был выглядеть следующим образом:
int a = 20;
int* b = amp;a;
cout << *b;
Ответ №8:
быстрое исправление для вывода только целых чисел:
int a; a = 20;
аннулирует getVar(int name) { cout << имя; }
getVar(a);
Если вам нужна функция для работы с любым типом переменной, возможно, подумайте о какой-нибудь шаблонной функции.
Редактировать: Вот код для шаблонной программы:
#include <iostream>
#include <string>
using namespace std;
template <class T>
void getVar(T name){
cout<<name<<endl;
}
int main()
{
string x="hee";
int y=10;
getVar(x);//outputs hee
getVar(y);//outputs 10
return 0;
}
Комментарии:
1. Ваш первоначальный ответ не имеет смысла. Вы скомпилировали и протестировали это? Кроме того, OP должен ссылаться на переменные по имени, а не только по значению. Весь ваш код может быть заменен простым
cout
выражением; без использования шаблонов.