2016-07-12 2 views
-1
#include <iostream> 
    #include <cmath> 
    using namespace std; 


    struct demo{ 
     int one; 
     int two; 
     int three; 
    }; 
    int main() 
    { 
     demo d1; 
      demo *dptr=&d1; 

      *dptr=1 ; 
      ++dptr; 
      *dptr=2; 
      ++dptr; 
      *dptr=3; 

     return 0; 
    } 

Пожалуйста, объясните, почему приведенный выше код выглядит логичным, но на самом деле не работает в строке 13 кода. Лог ошибок:структуры и указатели арифметические

no match for ' operator= ' in ' *dptr=1 '

+1

Потому что вы эффективно выполняете 'd1 = 1;' - как это будет работать? – immibis

+0

Вы пытаетесь установить значение демо-структуры для int, что? –

+0

спасибо immibis, глупо мне – afroCode

ответ

0

Вы должны объявить dptr в int*, не demo*.

int *dptr=&d1; // might need type cast (int*) 

*dptr=1 ; 
1
demo d1; 
demo *dptr=&d1; 

*dptr=1 ; 
++dptr; 
dptr=2; 
++dptr; 
dptr=3; 

dptr указатель, указывающий на demo структуры. Итак, *dptr = 1 в основном такой же, как d1 = 1;, что недействительно.

Плюс, имея указатель этого типа и делая ++, этот указатель применяет арифметику указателя для этого типа, перетаскивая указатель sizeof(demo), это не то, что вы хотите здесь. Вам нужно создать int указатель литья его, а затем, используя этот указатель для чтения 3 поля

int* dptr=reinterpret_cast<int*>(&d1); 

Перетяжка может еще разрушить ваш день, хотя, однако, так как они все int «S вы должны быть хорошо.

+0

хорошо понял Gill, но я полагаю, что если я возьму эту опцию [int * dptr = reinterpret_cast (&d1);], кто-то спросит: «Почему бы просто не использовать массив, если все члены являются типом типа?»? – afroCode

+0

@ user3568438 Возможно да, я не уверен, что такое ваш случай использования. –

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