3. Variable Basics
Variables are memory locations that have been given a name that stores certain information, depending on what type was specified. Make sure that you define a variable and give it a type. The different types contain alot of technical information that later on you should remember, but for now I think I can slide by in giving a brief definition of the different types:
short - holds a small numerical value (2 bytes)
int - holds a numerical value, on some computers it is larger than
a short, but not always, I suggest for any small number just
use an int don't worry about short. (2 or 4 bytes)
long - holds a slightly larger numeric value but depending on the
endianness of the computer could be the same as int. (4 bytes)
double - holds numerical values with decimal points such as 3.14
float - holds large numerical values with decimal points such as 3.141592653
char - holds a single character value (1 byte)
bool - holds either a true value or a false value.
Now this should suffice but there is one thing, on all these types except for char, the numerical ones in otherwords, you can further specify your needs through the 'signed' and 'unsigned' prefixes. Signed types only allow the variable
to hold negative data, while unsigned types can only hold positive. Unsigned is used alot for Ages, because you can't be -13 years old!
So you may be asking yourself how do I create a variable?
Well first thing you must define the variable, then you can assign a value to it and use it any way you want. Unfortunately there are
a few rules to naming variables, first you can't have spaces in your variable name (use an '_' character if you wanna space), second you can't use any special characters like !@#$%^&*()?, and last but not least you MUST start your variable with a letter, You can use numbers, but the first character must be a letter. I suggest using the camels back technique that I use in this tutorial. Now that I have explained the rules, lets play ball...
creating_var.cpp
----------------------------------
#include <iostream.h>
int VarInt;
// This has created an int variable called VarInt
unsigned int PosVar;
// This created a variable int that can only hold
// positive numbers
signed int NegVar;
// This created a variable int that can only hold
// negative numbers
double Pi = 3.14;
// This has created a double and assigned the value 3.14 to it
int main()
{
cout << "Enter a positive number: ";
cin >> PosVar;
cout << "Enter a negative number: ";
cin >> NegVar;
cout << "Enter a number negative or positve: ";
cin >> VarInt;
cout << "PosVar: " << PosVar << endl;
cout << "NegVar: " << NegVar << endl;
cout << "VarInt: " << VarInt << endl;
cout << "Pi: " << Pi << endl;
return 0;
}
This should be a good example of how to use variables. Basically,
define a variable, these are called global (any part of the program can
use them) variables. You could also use local (only the fuction that the
variable is in can use them) variables by moving the 'int VarInt;' or
whatever into the funtion that you need them in. This will be discussed in
chapter 6 Functions.
Now that we have gone over normal variables, it is time to go into
constants. Constants are variables that the value defined is never changed.
You should use constants anywhere that a variable has a defined value that
should not be changed. An example of this is a program that finds the area
of a circle.
area_of_circle.cpp
------------------------
#include <iostream.h>
const double PI = 3.14;
// this makes a double named PI with the value of 3.14
// that cannot be changed.
const int TWO = 2;
// this makes an int named TWO with the value of 2
// that cannot be changed.
long Radius;
// this makes a long named Radius that it's value
// CAN be changed.
float Area;
// this makes a float named Area that it's value
// CAN be changed.
int main()
{
cout << "Enter the Radius: ";
cin >> Radius;
// this next part may look a little greek for now
// but this is just to demonstrate that the PI and
// TWO are not changed.
Area = (Radius * TWO)* PI;
cout << "The area is: " << Area;
return 0;
}
Okay that should be all for the constants that you need. Lets move on
to something that makes programming a pain in the ass. This is straight up
memory allocation and management. What am I talking about? Well a thing we
call pointers. Pointers are variables that hold a specific memory address.
When called they will return what ever is in that memory address. Time for
and example:
basicpointers.cpp
------------------------------
#include <iostream.h>
int main()
{
int * p = 0; // The pointer is initiated to hold
// data the size of an int. Then the
// pointer is assigned to 0. Don't ask
// Why just always do it that way.
int a;
cout << "a: ";
cin >> a;
p = & // The & operator is also known as the 'address'
// operator. If it is put in front of a variable
// then the variable returns it's address instead
// of the data held in that address. Here we see
// the address of a is being assinged to p;
cout << "*p: " << *p; // The * before a pointer makes the pointer
// return the value stored in the address
// that the pointer is holding.
cout << "p: " << p; // Without the * the pointer just returns
// the address that it is holding.
cout << "*p: ";
cin >> *p; // Note the * in front of the pointer, this tells you that
// you are assigning the input to the address, and not the
// pointer.
cout << "a: " << a; // If this was compiled and ran this would
// return the value you just assigned to the
// *p.
return 0;
}
------------------------------
Okay now is where you ask me, "WTF? Why would I want to create just
another name for my varible??" and my response would be, "You wouldn't :)"
then you would give me a weird look and think I and stroustrup were both
insane. Well, even though you got half of that right, this demonstration is
only good for what I just did, a demonstration. BUT this does let you get
aquainted with the syntax, so now we can actually put pointers to some use...
Why would you use pointers?
1. Managing data on the free store.
2. Accessing class member data and functions.
3. Passing varibles by reference to functions.
Allocating, using, and deleting pointers.
audp.cpp
------------------------------
#include <iostream.h>
int main()
{
int Var = 3;
int * Pointer2Var = &Var;
int * Pointer2FS = new int;
if(Pointer2FS == NULL)
{
cout << "ERROR: Not Enough Memory!" << endl;
return 0;
}
*Pointer2FS = 5;
cout << "Var: " << Var << endl;
cout << "Pointer2FS: " << *Pointer2FS << endl;
cout << "Pointer2Var: " << *Pointer2Var << endl;
delete Pointer2FS;
Pointer2FS = new int;
if(Pointer2FS == NULL)
{
cout << "ERROR: Not Enough Memory!" << endl;
return 0;
}
*Pointer2FS = 9;
cout << "Pointer2FS: " << *Pointer2FS << endl;
delete Pointer2FS;
return 0;
}
------------------------------
Okay, I know there are no comments but that is because I plan to explain this slowly and not on the fly. The downfall of local variables is that when you return from a function all local variables are thrown away. Putting data on the free store using pointers solves this problem, the reason behind this is that data on the free store cannot be thrown away it
must be deleted by the programmer.
CAUTION: Be very careful when working with pointers to the free store, a rule of thumb is before you reassign a pointer make sure you delete it. Failure to do so is what calls memory leaks.
Now that I have given you the warnings let me expain what is going on here.
First, on line 6, we create a pointer with the memory address of Var, as I stated before this is mostly useless except for examples... Then, on line 7, we create a pointer to the free store the size of an int. This is done using the 'new' keyword, 'new' allocates a place in memory the size of the argument passed, in this case 'int'. Next, on lines 8 - 12, a test is preformed to see if you have enough memory left to create the pointer. This is important to do, everytime you create a pointer to the free store
you should test it to make sure that you will be able to place the data there, if not then the program should print an error message and exit the program (This is why it is concidered good practice to use 'int main()' so that you can 'return 0;' when an error occurs to stop the program on the spot. Now, on line 13, we place the value 5 on the free store. The next few lines show that you can use the pointer to the free store just like a variable. Then, on line 17, we deciede that we want to give the pointer a new value, so we first use the 'delete' command to clear up the address, then, on line 18, we use new to initialize the space for the free store once
again. The test is ran again on lines 19 - 23. And, on line 24, we reassign a value to the pointer. Before the program ends we use the delete command again to make sure we don't end up with a memory leak, and we exit the program. Now that wasn't so hard now was it. ;) Study it a few more times and continue on.
For now I want you to just get familiar with the above syntax. DO NOT CONTINUE WITHOUT LEARNING THIS! Later on we will get into actually doing some of these three and if you don't know pointers you will be lost beyond belief! Just take a few hours and REALLY study this section then move on.
Summary-
In this section you learned how to define and use variables, constants, and pointers. You also learned how to allocate memory on the free store.
|