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

Системное программирование, часть 1, задание 2
Code
#define PR(x) printf("x=%u, *x=%d, &x=%u\n", x, *x, &x);
#include <stdio.h>
#include <conio.h>

void main(void)
{
  int mas[]={100,200,300};
  int *ptr1, *ptr2;
  ptr1=mas;
  ptr2=&mas[2];
  PR(ptr1);
  ptr1++;
  PR(ptr1);
  PR(ptr2);
  ++ptr2;
  printf ("ptr2-ptr1=%u\n", ptr2-ptr1);
  getch();
}

Результат:

Начнём с того, что программа написана на Си, а не на Си++.
Как не парадоксально, но это разные вещи.

#define PR(x) printf("x=%u, *x=%d, &x=%u\n", x, *x, &x);
#define - директива препроцессора, работа производится до компиляции.
Данная строка создаёт псевдоним для операции форматированного вывода на экран переменной x.

Имеется массив типа int с тремя элементами, а также два указателя на int (ptr1 и ptr2).

ptr1=mas;
Данная запись означает то, что нашему первому указателю присваивается адрес с которого начинается наш массив.

ptr2=&mas[2];
Второму указателю присваивается адрес 3-го элемента. (не забываем что нумерация в Си начинается с нуля)

PR(ptr1); - выводим на экран.
x-ом у нас является указатель, значит, вывод x показывает нам адрес, хранящийся в указателе.

Вывод *x, операция разименовывания, показывает значение, находящиеся по адресу хранящемуся в указателе, а это адрес начала массива, т.е. первый элемент (индекс ноль у него, ещё раз повторю)

Вывод &x, операция взятия адреса, выводим адрес указателя, адрес, по которому хранится наш указатель. (мозг можно свернуть по началу, правда ? :))

Ну да ничего страшного, указателями пугают все кому не лень (особенно ленивые) Очень мощный инструмент в этом языке. Знать, как работать с указателями обязательно необходимо.

Далее...

Code
ptr1++;
PR(ptr1);
PR(ptr2);

Увеличиваем значение в ptr1, т.е. адрес и выводим на экран.
Так как ptr1 - указатель, его значение увеличится на длину типа представляемой информации, т.е. у нас, значения типа int, а это 4-е байта, значит увеличение адреса произойдёт на 4.
Это видно из скриншота результата.
Адрес увеличился на 4, значение лежащее по этому адресу = 200 (второй элемент массива), адрес указателя не изменился.
Затем, выводим значение второго указателя, а это:
Указатель хранит адрес значения последнего элемента массива, естественно адрес больше на четыре байта чем ptr1, который указывает на второй элемент.
Значение по адресу = 300, адрес, где хранится второй указатель отличается от первого. (что вполне логично)

Code
++ptr2;
printf ("ptr2-ptr1=%u\n", ptr2-ptr1);
getch();

Увеличиваем адрес, вычитанием указателей определяем количество элементов.
Например чтобы узнать количество элементов в массиве, нам нужно в pr1 поместить адрес начала массива (это просто mas), а в ptr2 поместить адрес, следующий за массивом (ptr2=mas[2]; ptr2++;), а затем вычесть из второго первый (ptr2-ptr1=количество элементов массива)

getch(); - ждёт нажатия клавиши на клавиатуре (так как программа на Си, я не стал использовать функцию system)

Счастливо !

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

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