Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ For Dummies (2004) [eng].pdf
Скачиваний:
84
Добавлен:
16.08.2013
Размер:
8.09 Mб
Скачать

 

 

 

Chapter 8: Taking a First Look at C++ Pointers 117

n

=

0

 

lower =

0

 

Storing

13.0 into the location &n

The final results are:

upper

= 1076494336

n

=

0

lower

=

0

Press

any key to continue . . .

The house equivalent goes something like this:

House* houseAddress = &”123 Main Street”;

Hotel* hotelAddress;

hotelAddress = (Hotel*)houseAddress; *hotelAddress = TheRitz;

houseAddress is initialized to point to my house. The variable hotelAddress is a pointer to a hotel. Now, the house address is cast into the address of a hotel and saved off into the variable hotelAddress. Finally, TheRitz is plopped down on top of my house. Because TheRitz is slightly bigger than my house (okay, a lot bigger than my house), it isn’t surprising that TheRitz wipes out my neighbors’ houses as well.

The type of pointer saves the programmer from stuffing an object into a space that is too big or too small. The assignment *pintVar = 100.0; actu­ ally causes no problem — because C++ knows that pintVar points to an int, C++ knows to demote the 100.0 to an int before making the assignment.

Passing Pointers to Functions

One of the uses of pointer variables is in passing arguments to functions. To understand why this is important, you need to understand how arguments are passed to a function.

Passing by value

You may have noticed that it is not normally possible to change the value of a variable passed to a function from within the function. Consider the following example code segment:

118 Part II: Becoming a Functional C++ Programmer

void fn(int intArg)

{

intArg = 10;

// value of intArg at this point is 10

}

void parent(void)

{

int n1 = 0; fn(n1);

// value of n1 at this point is 0

}

Here the parent() function initializes the integer variable n1 to zero. The value of n1 is then passed to fn(). Upon entering the function, intArg is equal to 10, the value passed. fn() changes the value of intArg before returning to parent(). Perhaps surprisingly, upon returning to parent(), the value of n1 is still 0.

The reason is that C++ doesn’t pass a variable to a function. Instead, C++ passes the value contained in the variable at the time of the call. That is, the expression is evaluated, even if it is just a variable name, and the result is passed.

It is easy for a speaker to get lazy and say something like, “Pass the variable x to the function fn().” This really means to pass the value of the expression x.

Passing pointer values

Like any other intrinsic type, a pointer may be passed as an argument to a function:

void fn(int* pintArg)

{

*pintArg = 10;

}

void parent(void)

{

int n = 0;

 

fn(&n);

// this passes the address of i

}

// now the value of n is 10

 

In this case, the address of n is passed to the function fn() rather than the value of n. The significance of this difference is apparent when you consider the assignment within fn().

Chapter 8: Taking a First Look at C++ Pointers 119

Suppose n is located at address 0x102. Rather than the value 10, the call fn(&n) passes the value 0x102. Within fn(), the assignment *pintArg = 10 stores the value 10 into the int variable located at location 0x102, thereby overwriting the value 0. Upon returning to parent(), the value of n is 10 because n is just another name for 0x102.

Passing by reference

C++ provides a shorthand for passing arguments by address — a shorthand that enables you to avoid having to hassle with pointers. In the following example, the variable n is passed by reference.

void fn(int& intArg)

{

intArg = 10;

}

void parent(void)

{

int n = 0; fn(n);

// here the value of n is 10

}

In this case, a reference to n rather than its value is passed to fn(). The fn() function stores the value 10 into int location referenced by intArg.

Notice that reference is not an actual type. Thus, the function’s full name is fn(int) and not fn(int&).

Making Use of a Block of

Memory Called the Heap

The heap is an amorphous block of memory that your program can access as necessary. This section describes why it exists and how to use it.

Visual C++.NET allows the programmer to write code in what is known as managed mode in addition to the conventional, “unmanaged mode.” In man­ aged mode, the compiler handles the allocation and deallocation of memory. Managed programs rely upon the .NET framework. Only Visual C++.NET cur­ rently supports managed mode. This book only covers unmanaged mode programming.

120 Part II: Becoming a Functional C++ Programmer

Just as it is possible to pass a pointer to a function, it is possible for a func­ tion to return a pointer. A function that returns the address of a double is declared as follows:

double* fn(void);

However, you must be very careful when returning a pointer. In order to understand the dangers, you must know something about variable scope. (No, I don’t mean a variable zoom rifle scope.)

Limiting scope

C++ variables have a property in addition to their value and type known as scope. Besides being a mouthwash, scope is the range over which a variable is defined.

Consider the following code snippet:

//the following variable is accessible to

//all functions and defined as long as the

//program is running(global scope)

int intGlobal;

//the following variable intChild is accessible

//only to the function and is defined only

//as long as C++ is executing child() or a

//function which child() calls (function scope) void child(void)

{

int intChild;

}

//the following variable intParent has function

//scope

void parent(void)

{

int intParent = 0; child();

int intLater = 0; intParent = intLater;

}

int main(int nArgs, char* pArgs[])

{

parent();

}