Помогают указатели C ?

#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 выражением; без использования шаблонов.