|
C++ Programming Tutorials
Basics of C++
Structure of a
program
Variables
Data types
Constants
Operators
Basic Input/output
Control Structures
Control Structures
Functions (I)
Functions (II)
Compound Data Types
Arrays
Character Sequences
Pointers
Dynamic Memory
Data Structures
Other Data Types
Object Oriented Programming
Classes [I]
Classes [II]
Friendship & Inheritance
Polymorphism
Advanced Concepts
Templates
Namespaces
Exceptions
Type Casting
Preprocessor Directives
C++ Standard Library
Input/output with Files
Soft Skills
Communication Skills
Leadership Skills
.........More
|
|
C++ Programming Tutorials
Declaring variables
of pointer types
Due to the ability of a pointer to directly refer to the value that it
points to, it becomes necessary to specify in its declaration which data
type a pointer is going point to. It is not the same thing to point to a
char than to point to an int or a float.
The declaration of pointers follows this format:
type * name;
where type is the data type of the value that the pointer is intended to
point to. This type is not the type of the pointer itself! but the type
of the data the pointer points to. For example:
int * number;
char * character;
float * greatnumber; |
These are three declarations of pointers. Each one is
intended to point to a different data type, but in fact all of them are pointers
and all of them will occupy the same amount of space in memory (the size in
memory of a pointer depends on the platform where the code is going to run).
Nevertheless, the data to which they point to do not occupy the same amount of
space nor are of the same type: the first one points to an int, the second one
to a char and the last one to a float. Therefore, although these three example
variables are all of them pointers which occupy the same size in memory, they
are said to have different types: int*, char* and float* respectively, depending
on the type they point to.
I want to emphasize that the asterisk sign (*) that we use when declaring a
pointer only means that it is a pointer (it is part of its type compound
specifier), and should not be confused with the dereference operator that we
have seen a bit earlier, but which is also written with an asterisk (*). They
are simply two different things represented with the same sign.
Now have a look at this code:
// my first pointer
#include <iostream>
using namespace std;
int main ()
{
int firstvalue, secondvalue;
int * mypointer;
mypointer = &firstvalue;
*mypointer = 10;
mypointer = &secondvalue;
*mypointer = 20;
cout << "firstvalue is " << firstvalue << endl;
cout << "secondvalue is " << secondvalue << endl;
return 0;
} |
firstvalue is 10
secondvalue is 20
|
Notice that even though we have never directly set a value to
either firstvalue or secondvalue, both end up with a value set indirectly
through the use of mypointer. This is the procedure:
First, we have assigned as value of mypointer a reference to firstvalue using
the reference operator (&). And then we have assigned the value 10 to the memory
location pointed by mypointer, that because at this moment is pointing to the
memory location of firstvalue, this in fact modifies the value of firstvalue.
In order to demonstrate that a pointer may take several different values during
the same program I have repeated the process with secondvalue and that same
pointer, mypointer.
Here is an example a little bit more elaborated:
// more pointers
#include <iostream>
using namespace std;
int main ()
{
int firstvalue = 5, secondvalue = 15;
int * p1, * p2;
p1 = &firstvalue; // p1 = address of firstvalue
p2 = &secondvalue; // p2 = address of secondvalue
*p1 = 10; // value pointed by p1 = 10
*p2 = *p1; // value pointed by p2 = value pointed by p1
p1 = p2; // p1 = p2 (value of pointer is copied)
*p1 = 20; // value pointed by p1 = 20
cout << "firstvalue is " << firstvalue << endl;
cout << "secondvalue is " << secondvalue << endl;
return 0;
} |
firstvalue is 10
secondvalue is 20
|
I have included as a comment on each line how the code can be
read: ampersand (&) as "address of" and asterisk (*) as "value pointed by".
Notice that there are expressions with pointers p1 and p2, both with and without
dereference operator (*). The meaning of an expression using the dereference
operator (*) is very different from one that does not: When this operator
precedes the pointer name, the expression refers to the value being pointed,
while when a pointer name appears without this operator, it refers to the value
of the pointer itself (i.e. the address of what the pointer is pointing to).
Another thing that may call your attention is the line:
This declares the two pointers used in the previous example.
But notice that there is an asterisk (*) for each pointer, in order for both to
have type int* (pointer to int).
Otherwise, the type for the second variable declared in that line would have
been int (and not int*) because of precedence relationships. If we had written:
p1 would indeed have int* type, but p2 would have type int
(spaces do not matter at all for this purpose). This is due to operator
precedence rules. But anyway, simply remembering that you have to put one
asterisk per pointer is enough for most pointer users.
NEXT >>
Pointers and Arrays
Have a Question ?
post your questions here. It
will be answered as soon as possible.
Check
C Aptitude Questions
for more C Aptitude Interview Questions with Answers
Check
C Interview Questions
for more C Interview Questions with Answers.
|