分类: LINUX
2010-07-07 20:53:54
|
Number
referred to in AddFive
is a copy of the variable nMyNumber
passed to the function, not the variable itself. Therefore, the line Number = Number + 5
adds five to the copy of the variable, leaving the original variable in main()
unaffected. Try running the program to prove this.
|
void AddFive(int Number)
to void AddFive(int* Number)
,
adding the asterisk. Here is the program again, with the changes made.
Notice that we have to make sure we pass the address of nMyNumber
instead of the number itself? This is done by adding the &
sign, which (as you will recall) is read as "the address of."
|
*
before Number
in the AddFive
function? This is needed to tell the compiler that we want to add five to the number pointed to by the variable Number
,
rather than add five to the pointer itself. The final thing to note
about functions is that you can return pointers from them as well, like
this:int * MyFunction();
In this example, MyFunction
returns a pointer to an integer.
|
|
MyClass
as follows:MyClass thing;
You should already know this. If not, try reading up on this area. To define a pointer to MyClass
, you would use:MyClass *thing;
...as you would expect. Then you would allocate some memory and make this pointer point to the memory:thing = new MyClass;
This is where the problem comes in: how then would you use this pointer? Well, normally you would write'thing.m_Number
, but you can't with a pointer because thing
is not a MyClass
, but a pointer to it. So, thing
itself does not contain a variable called m_Number
; it is the structure that it points to that contains m_Number
. Therefore we must use a different convention. This is to replace the .
(dot) with a ->
(dash followed by a greater than sign). An example showing this is below:
|
int *pArray;
pArray = new int[6];
This will create a pointer, pArray
, and make it point to an array of six elements. The other method, not using dynamic allocation, is as follows:int *pArray;
int MyArray[6];
pArray = &MyArray[0];
Note that, instead of writing &MyArray[0]
, you can simply write MyArray
.
This, of course, only applies to arrays and is a result of how they
implemented in the C/C++ language. A common pitfall is to write pArray = &MyArray;
,
but this is incorrect. If you write this, you will end up with a
pointer to a pointer to an array (no typo), which is certainly not what
you want.int
s. The pointer will initially point to the first value in the array, as the following example shows:
|
pArray++
. We can also, as some of you probably guessed by now, say pArray + 2
,
which would move the array pointer on by two elements. The thing to be
careful of is that you know the what the upper bound of the array is (3
in this example), because the compiler cannot check that you have not
gone past the end of array when you are using pointers. You could
easily end up crashing the system that way. Here is the example again,
this time showing the three values that we set:
|
pArray - 2
is 2 elements from where pArray
is currently pointing. Make sure, however, that you add or subtract to
the pointer and not to its value. This kind of manipulation using
pointers and arrays is most useful when used in loops, such as the for
or while loops.int* pNumberSet
, you can treat it as an array. For example, pNumberSet[0]
is equivalent to *pNumberSet
; similarly, pNumberSet[1]
is equivalent to *(pNumberSet + 1)
.new
, as in the following example:int *pArray;
pArray = new int[6];
...it must be deleted using the following:delete[] pArray;
Notice the []
after delete
.
This tells the compiler that it is deleting a whole array and not just
a single item. You must use this method whenever arrays are involved;
otherwise, you will end up with a memory leak.
|
Q: Why do I get "symbol undefined" errors on new
and delete
?
A: This is most likely caused by your source file being interpreted by the compiler as being a plain C file. The new
and delete
operators are a new feature of C++. This is usually remedied by ensuring that you are using a *.cpp extension on your source code files.
Q: What's the difference between new
and malloc
?
A: new
is a keyword only present in C++ and is now the standard way (other
than using Windows' memory allocation routines) to allocate memory. You
should never use malloc
within a C C++ application unless absolutely necessary. Because malloc
is not designed for the object-oriented features of C++, using it to
allocate memory for classes will prevent the constructor of the class
being called, as just one example of the problems that can arise. As a
result of the problems that arise from the use of malloc
and free
,
and because they are now for all intents and purposes obsolete, they
are not discussed in any detail in this article. I would discourage
their use wherever possible.
Q: Can I use free
and delete
together?
A: You should free memory with the equivalent routine to that used to allocated it. For instance, use free
only on memory allocated with malloc
, delete
only on memory allocated with new
and so on.
int& Number = myOtherNumber;
Number = 25;
The reference is like a pointer to myOtherNumber
, except
that it is automatically dereferenced. So, it behaves just as it were
the actual value type rather than a pointer type. The equivalent code
to this, using pointers, is shown below:int* pNumber = &myOtherNumber;
*pNumber = 25;
The other difference between pointers and references is that you cannot
"reseat" a reference. That is to say that you cannot change what it is
pointing to after its declaration. For instance, the following code
would output "20."
|
|
*
) in front of the variable name (i.e. int *number
). &
) in front of it, i.e. pNumber = &my_number
. int *number
), should be read as "the memory location pointed to by." int &number
), should be read as "the address of." new
keyword. int *number
will not point to a MyClass
. delete
keyword. &array[0];
. delete[]
, not just delete
.