class A {
public: int i;
};
A *a = new A();
Как узнать адрес a->i
? Я пробовал &a->i
, а также &(a->i)
, но они генерируют ошибки времени компиляции:
"слева от '.i' должен иметь тип" класс / структура / объединение "
6 ответов
Вы не предоставили тот же код, который пытались скомпилировать. Всегда копируйте и вставляйте . В вашем коде говорится о том, что у вас нет синтаксически правильного объявления класса или объявления переменной, и что в вашем сообщении об ошибке говорится о ".i", когда вы утверждали, что использовали только a->i
. Вот рабочий код:
#include <stdio.h>
class A {
public:
int i;
};
int main() {
A* a = new A();
int* i = &a->i;
printf("a: %p\na->i: %p\n", a, i);
return 0;
}
В конечном итоге синтаксис, который вы говорите пытались получить для получения адреса члена, оказался правильным. В сообщении об ошибке указано, что вы пробовали использовать синтаксис a.i
. Это не работает, и по той причине, что было выдано сообщение об ошибке. Переменная a
не является типом класса, структуры или объединения. Скорее, это указатель на один из этих типов. Вам нужно разыменовать указатель, чтобы добраться до члена.
Когда запускаю, получаю вот что:
$ ./a.out a: 40748 a->i: 40748
Адреса такие же, потому что A
- простой класс, поэтому этого вывода следовало ожидать. Первый член часто помещается в самое начало памяти класса. Добавьте в класс вторую переменную-член и получите ее адрес; тогда вы должны увидеть разные значения.
В с ++:
class A {
public: // note colon after public
int i;
}; // note semicolon after bracket
A *a = new A(); // note *a not a*
Печатать:
cout << ios::hex << &a->i << endl;
Для меня это работает нормально.
& a-> я должен работать. В вашем случае, поскольку у класса есть только одно общедоступное целое число, адрес a и i будет одинаковым.
Вы на правильном пути, но из-за ошибки компиляции, которую вы упомянули, похоже, что вы набирали "&a.i
"
class A
{
public:
int i;
};
...
A *a = new A();
int *i = &a->i;
Кажется, этот код компилируется?
class A {
public:
int i;
};
int main() {
A *a = new A();
int *x = &a->i;
return 0;
}
Следующее работает для меня с использованием g ++
class A
{
public:
int m_i;
};
int
main()
{
A* a = new A();
int* i_ptr = &(a->m_i);
return 0;
}
Полагаю, вы имеете в виду A* a = ...
, а не A a* = ...
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .