Uses for Pointers

Pages: 123
Feb 4, 2012 at 4:42pm
What exactly is the point of pointers. From what I've seen all you can with them is:
*x=&y
which is the same as
x=y
What else can they do?
Last edited on Feb 4, 2012 at 4:45pm
Feb 4, 2012 at 4:51pm
Oh God. Where's that FAQ got to?

Things you can do with pointers that you can't do (or are very difficult) otherwise:

Use memory that isn't on the stack (your stack is probably limited to a few megabytes - want more than that? Pointers ahoy).
Directly interface with hardware (hardware uses fixed memory locations - I'd like to see you access one without a pointer).
Polymorphism.

Last edited on Feb 4, 2012 at 4:54pm
Feb 4, 2012 at 5:03pm
Point.
Feb 4, 2012 at 6:32pm
Point.
Feb 4, 2012 at 6:34pm
Building dynamic data structures, passing larger data structures around without having to make copies of them on the stack...
Feb 5, 2012 at 1:07am
closed account (z05DSL3A)
Moschops wrote:
Oh God. Where's that FAQ got to?
Feel free to draft an entry for the FAQ. All help is appreciated . :0)
Feb 5, 2012 at 2:17am
Is *x=&y the same as x=y?

I would think that *x=&y is assigning the address of y to the address pointed to by x, where ever x points, where x=y is assigning the value contained in y to address pointed to by x.
Feb 5, 2012 at 2:22am
Is *x=&y the same as x=y?

You're right, it's not.
Feb 5, 2012 at 4:42pm
well no its not exactly the same, but either way x gets the value of y.
maybe I was thinking of &y = *x.

Can you give me an example of another way to use them. Most of what I know in C++, I dont really know by its proper term so explaining it usually confuses me more.
Feb 5, 2012 at 4:46pm
1
2
3
4
5
int hugeArray[100000000]; // Oh no, causes a stack overflow! I can't make an array this big

int* pToHugeArray = new int[100000000]; // Yay! Now I CAN have an array that big, but I have to use a pointer
                                        // This works because the first array was being made on the "stack", which is not very big, but new
                                        //      gets space from the "heap" which is way bigger :) 
Last edited on Feb 5, 2012 at 5:04pm
Feb 5, 2012 at 4:52pm
Let's check the manual for this piece of hardware. Aha, the input voltage from the sensor can be read at memory location 0x1234FFDD, where it is presented as a four byte integer. I want to read that value. Luckily, I have pointers, otherwise I would have no way to explicitly identify a known memory location. I happen to know that my system uses four byte integers, so I can interpret the value directly as an int.

1
2
3
int* pointerToVoltageReading = (int*)0x1234FFDD;
// Now, what's that voltage reading?
int voltage = *pointerToVoltageReading;
Last edited on Feb 5, 2012 at 5:05pm
Feb 5, 2012 at 4:57pm
I want to make an array, but I don't know how big it needs to be. That will be decided at runtime, perhaps by the user entering a value.

I'll try this:

1
2
cin >> n; // Fetch value from user
int someArray[n]; // Make the array. OH NO! C++ forbids arrays of variable size like this! 


What shall I do? Hmm... I could use a C++ container like a vector, but I'd like to keep this as an array. Aha, I know! I can use the new command to make an array of variable size at runtime, like this:

1
2
cin >> n; // Fetch value from user
int* pointerToArray = new int[n]; // new returns a pointer, so I'll have to use that pointer to access the array 
Last edited on Feb 5, 2012 at 4:58pm
Feb 5, 2012 at 5:48pm
closed account (D80DSL3A)
Moschops also mentioned polymorphism. This is very powerful.

I'm working on a card game just now (rummy). There are 2 hands, a deck, a discardPile, and 2 vectors of playStacks (where the players place their card plays on the table). All of these derive from a cardStack base class (since they all have different behaviors). Cards move from the deck to the hands, to/from the discardPile and the playStacks but in all cases the code for this is simply
p_src->sendCard( p_dest );. Here p_src and p_dest are pointers to 2 cardStacks of whatever type. Cool stuff!
Feb 5, 2012 at 5:52pm
ok thanks
I have one other problem though.

What exactly do * and -> point to?
I read the entry on the tutorial but I doesnt rally make a lot of sense to me.
Feb 5, 2012 at 6:01pm
* is the dereference operator, it returns the value at the address that the pointer points to. You use it to declare a pointer too. -> is the member selection operator used with pointers. Instead of writing (*pntr).classMember, which looks ugly, you use -> and write pntr->classMember, which looks more understandable.
Feb 5, 2012 at 6:06pm
So it looks for a member at a class address, or the member value address?
Feb 5, 2012 at 6:19pm
Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Something
{
public:
        void print()
        {
             std::cout << "Hello World!" << std::endl;
         }
};

int main()
{
    Something cSomething;
    Something *pntr = &cSomething;

    cSomething.print();
    pntr->print();
}


Feb 5, 2012 at 6:23pm
ok thanks.
Would pntr and cSomething ever have different values?
Feb 5, 2012 at 6:50pm
Would pntr and cSomething ever have different values?

They always have different values. One of them is a pointer. Its value is a single number. One of them is an object of type Something. Its "value" doesn't make a lot of sense, but it has internal members that themselves can have values.

The value of the pointer in the case above is equal to the address that the Something object is sitting in. That doesn't mean they have the same value. I'm not sure you've understood what a pointer is. Read this:

http://www.cplusplus.com/articles/EN3hAqkS/

and other such in the Articles section.
Last edited on Feb 5, 2012 at 6:53pm
Feb 5, 2012 at 6:53pm

Another example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>

class Something
{
    public:

    int value1;

};

int main()
{
    Something cSomething;
    Something *pntr = &cSomething;

    cSomething.value1 = 5;
    std::cout << cSomething.value1 << std::endl; //This will print 5
    std::cout << pntr->value1 << std::endl; // This will print 5

    pntr->value1 = 6;
    std::cout << cSomething.value1 << std::endl; // This will print 6
    std::cout << pntr->value1 << std::endl; //This will print 6


}


Last edited on Feb 5, 2012 at 6:54pm
Pages: 123