Пятница, 18.07.2025, 10:19
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
.:: Меню ::.
.:: Категории каталога ::.
Разное [5]
Различные темы по программированию
Пакет SWT [4]
Практикуемся в написании оконных приложений на Java
Среды разработки, компиляторы и т.п [3]
Сравнения, описания, плюсы и минусы сред разработки. Сравнение компиляторов.
Java [8]
Объектно-ориентированные соображения.
Си++ [19]
Коротко и ясно
Ассемблер [6]
Машинные коды, побитно :)
Форма входа
.:: Поиск ::.
.:: Дополнительно ::.
    Хостинг от Loqo.ru
             .:: Коментируем ::.
Главная » Статьи » Текстовый материал » Си++

Работа с указателями
Указатели ! Один из страшнейших снов начинающих программистов. smile
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;

Когда мы используем несколько операторов из какого-то пространства имён, то можно записать вышеописанным способом, чтобы не описывать всё пространство.
Этот пример прокомментирован, так-что у вас не должно возникнуть вопросов.
Ну а если возникли то в форум smile

На этом всё.

Категория: Си++ | Добавил: C0demaker (02.04.2009)
Просмотров: 1715 | Рейтинг: 0.0/0
Всего комментариев: 0

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Ant1 © 2025