56

I am trying to create an array of pointers. These pointers will point to a Student object that I created. How do I do it? What I have now is:

Student * db = new Student[5];

But each element in that array is the student object, not a pointer to the student object. Thanks.

Daniel Daranas
  • 22,454
  • 9
  • 63
  • 116
chustar
  • 12,225
  • 24
  • 81
  • 119

4 Answers4

103
Student** db = new Student*[5];
// To allocate it statically:
Student* db[5];
Mehrdad Afshari
  • 414,610
  • 91
  • 852
  • 789
  • 1
    How is `Student* db[5]` the same thing as `Student** db = new Student*[5]`? What is the benefit of using one over the other? – dispatchswift Oct 10 '16 at 07:37
  • 4
    When you wish to return an array from a function the array needs to be allocated on the heap. If it s allocated on the stack it is destroyed immediately the scope of that function ends. – Mutai Mwiti Mar 28 '17 at 14:41
21
#include <vector>
std::vector <Student *> db(5);
// in use
db[2] = & someStudent;

The advantage of this is that you don't have to worry about deleting the allocated storage - the vector does it for you.

  • 1
    While vector is the suggested way to have a list of stuff, strictly speaking, it's not an array. – Mehrdad Afshari Mar 06 '09 at 23:23
  • It can be used in every way that an array can be used. If it quacks like a duck, it's a duck. –  Mar 06 '09 at 23:25
  • 6
    The vector will _not_ delete the allocated storage automatically, it will free the storage for the _pointers_ but not for the memory that the pointer points to. Use boost::ptr_vector for that. – Patrick Glandien Mar 07 '09 at 00:00
  • Did you read my example code? Should the storage pointed to by element [2] be deleted? –  Mar 07 '09 at 00:22
12

An array of pointers is written as a pointer of pointers:

Student **db = new Student*[5];

Now the problem is, that you only have reserved memory for the five pointers. So you have to iterate through them to create the Student objects themselves.

In C++, for most use cases life is easier with a std::vector.

std::vector<Student*> db;

Now you can use push_back() to add new pointers to it and [] to index it. It is cleaner to use than the ** thing.

ypnos
  • 50,202
  • 14
  • 95
  • 141
-6
    void main()
    {
    int *arr;
    int size;
    cout<<"Enter the size of the integer array:";
    cin>>size;
    cout<<"Creating an array of size<<size<<"\n";
        arr=new int[size];
    cout<<"Dynamic allocation of memory for memory for array arr is successful";
    delete arr;
    getch();enter code here
}
Narendra Jadhav
  • 10,052
  • 15
  • 33
  • 44