3

I have this declaration in the header file

private:
MyIntegerClass *myArr;
MyIntegerClass myIntegerClass;
MyIntegerClass *ptr_myIntegerClass = &myIntegerClass;

MyIntegerClass is a class that have one data memeber that holds an integer. It has two member-functions - an accessor and a mutator.

And this is the cpp-file of the Array-class - the class that allocates memory for the array, and fills the array with values and lastly prints the array

Array::Array() {

    myArr = new MyIntegerClass[10];
    for (int i = 0; i < 10; i++) {
           ptr_myIntegerClass->setNumber(i);
           myArr[i] = *ptr_myIntegerClass;
    }
}

Array::~Array() { }

void Array::printArray() {
    for (int i = 0; i < 10; i++) {
        cout << myArr[i].getNumber() << endl;
}

I am new to C++ and I have thorough certain knowledge of C and through trial and error made this program that compiles and print these values without errors. But there's a couple things I do not understand:

  • Both myArr and ptr_myIntegerClass are pointers. But how could the following be correct:

      myArr[i] = *ptr_myIntegerClass;
    

For what I know - to put an * ahead of an pointer means that you dereference the pointer? right? So how could myArr that is a pointer store this dereferenced value? Or am I wrong about that myArr is a pointer? But why is it declared with a * in the header file?

user2991252
  • 760
  • 2
  • 11
  • 28

1 Answers1

5

The asterisk and the square brackets both decrease the level of dereference. In fact, myArr[i] is equivalent to *(myArr+i), and *ptr_myIntergerClass is equivalent to ptr_myIntergerClass[0]. Therefore, your assignment is equivalent to either

*(myArr+i) = *ptr_myIntergerClass;

or

myArr[i] = ptr_myIntergerClass[0];

which are both valid, because both their sides have the same type (i.e. MyIntergerClass) and the left side is assignable (i.e. an lvalue).

Community
  • 1
  • 1
Sergey Kalinichenko
  • 714,442
  • 84
  • 1,110
  • 1,523