Указатели ! Один из страшнейших снов начинающих программистов. Code #include <iostream>
using namespace std;
int global=1234;
void main (void) { cout << "adress of global int (1234)= " << &global << endl; int local=4321; cout << "adress of local int (4321)= " << &local << endl;
int *p0; char *p1; char (*p2)[5];
int a=1; cout << "int a= " << a << endl;
char b='z'; cout << "char b= " << b << endl;
char c[] = "word"; cout << "char c[]= " << c << endl;
p0= &a; cout << "adress of int a= " << p0 << endl;
p1= &b; cout << "adress of char b= " << p1 << endl; cout << "adress of char b= " << (int)p1 << endl; cout << "adress of char b= " << hex << (int)p1 <<endl; printf ("Addres of char b= %x \n", &b);
p2 = &c; cout << "adress of char c[]= " << p2 << endl; cout << "adress of char c[2]= " << &c[2] << endl; cout << "adress of char c[2]= " << hex << (int)&c[2] << endl; printf ("Addres of char c[2]= %x \n", &c[2]); system ("PAUSE"); } Результат: Перед функцией main объявлена глобальная переменная global. Внутри функции объявлена переменная local. Для того, чтобы узнать адрес в памяти, где хранится значение переменной, мы перед именем переменной поставим оператор &. В результате видно что их адреса различны, это объясняется тем, что локальные переменные хранятся в стеке, а глобальные в памяти выделяемой программе операционной системой под данные. p0,p1,p2 являются указателями на определённый тип данных, перед их именами стоит звёздочка. Далее я пробую работу с целыми числами, символом и массивом символов. При использовании потока вывода C++ возникла небольшая проблема с выводом символа. Решилась проблема использованием следующего: cout << hex << (int)p1 Сначала преобразуем адрес символа в целое числа, а затем выведем его в 16-иричном виде. Можно и в десятичном конечно, но адрес целого числа a например, выводится сразу в 16-иричном виде. Для примера я ещё использовал ещё один вариант вывода: printf ("Addres of char b= %x \n", &b); Тоже подходит, но это Си, а мы всё-таки ориентируемся на Си++ больше. system ("PAUSE"); Выдоет сообщение в консоле о необходимости нажать кнопку для продолжения. Ссылка на массив описана следующим образом char (*p2)[5], т.к. запись такого выида: char *p2[5] будет являтся массивом ссылок. Второй пример с MSDN. Code #include <iostream>
int main() { int n = 5; int &shadow = n; //адрес переменной shadow равен адресу n int *pn = &n; //указатель pn содержит адрес локальной переменной n int **ppn = &pn; //указатель на указатель содержит адрес указателя pn <img src="http://s27.ucoz.net/sm/24/smile.gif" border="0" align="absmiddle" alt="smile">
using std::cout; using std::endl; cout << "Value of n:\n" << "direct value: " << n << endl //отображаем переменную n << "indirect value: " << *pn << endl //отображаем значение по адресу в pn << "doubly indirect value: " << **ppn << endl //отображаем значение по адресу находящемуся по адресу ppn << "address of n: " << pn << endl //отображаем адрес n << "address of n via indirection: " << *ppn << endl //отображаем значение находящийся по адресу ppn, а это адрес << "value of shadow: " << shadow << endl; shadow++; //Инкрементируем shadow cout << "value of n: " << n << endl; //а в итоге поменялась n, чудеса system("PAUSE"); } // Вот такие пироги Результат В данной программе используется следующий вид объявления пространства имён. using std::cout; using std::endl; Когда мы используем несколько операторов из какого-то пространства имён, то можно записать вышеописанным способом, чтобы не описывать всё пространство. Этот пример прокомментирован, так-что у вас не должно возникнуть вопросов. Ну а если возникли то в форум На этом всё.
|