Форум программистов, компьютерный форум CyberForum.ru

Указатели - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Составить программу, в которой описывается структура из полей: Название товара, Цена, Размер партии товара... http://www.cyberforum.ru/cpp-beginners/thread779336.html
Составить программу, в которой описывается структура из полей: Название товара, Цена, Размер партии товара (в штуках). Организовать ввод двух структурных переменных, вывод каждой структуры на экран и расчет значения "Стоимость товара". Стоимость товара = Цена товара * Размер партии товара.
C++ Реализация стека Здравствуйте, помогите пожалуйста с реализацией стека без использования STL. Стек отображен в памяти Вектором, память статическая(1 вариант), динамическая (2 вариант). http://www.cyberforum.ru/cpp-beginners/thread779335.html
C++ Продолжение строки с нового абзаца в коде
Собствено, как: printf("Hello World"); Без использования std::string! Именно константым литералом
Составьте программу, которая создает очередь из произвольного количества элементов C++
Здравствуйте! Помогите пожалуйста с задачей. Составьте программу, которая создает очередь из произвольного количества элементов. Информационная часть динамического элемента должна состоять из двух целых чисел. Организуйте обработку каждого элемента: печать целых чисел из информационной части и их среднее значение.
C++ Описать рекурсивную функцию вещественного типа, находящую значение N й степени числа X по формулам: http://www.cyberforum.ru/cpp-beginners/thread779324.html
• Описать рекурсивную функцию вещественного типа, находящую значение N й степени числа X по формулам: X 0 = 1, X N = (X N/2)2 при четных N > 0, X N = X•X N–1 при нечетных N > 0, X N = 1/X –N при N < 0 (X ? 0 — вещественное число, N — целое; в формуле для четных N должна использоваться операция целочисленного деления). С помощью этой функции найти значения X N для данного X при пяти данных...
C++ Описать рекурсивную функцию целого типа, находящую C(N, K) — число сочетаний из N элементов по K — с помощью рекуррентного соотношения: Описать рекурсивную функцию целого типа, находящую C(N, K) — число сочетаний из N элементов по K — с помощью рекуррентного соотношения: C(N, 0) = C(N, N) = 1, C(N, K) = C(N – 1, K) + C(N – 1, K – 1) при 0 < K < N. Параметры функции — целые числа; N > 0, 0 ? K ? N. Дано число N и пять различных значений K. Вывести числа C(N, K) вместе с количеством рекурсивных вызовов функции,... подробнее

Показать сообщение отдельно
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
05.02.2013, 12:34     Указатели
Указатели представляют собой адресные переменные. То есть они содержат адрес объекта/переменной в памяти. Например переменная int omg; cout << &omg; выведет её адрес. Определив указатель на переменную int следующим образом: int *ptr; можем присвоить ему адрес переменной omg, ptr = &omg; так же мы можем присвоить указателю адрес переменной используя операцию расшифровки, она тоже выглядит как символ *.
Важно не путать с символом * в определении указателя, здесь мы используем его, чтобы создать указатель. Опять же пример с переменной int omg;. Присваиваем адрес переменной omg указателю ptr. *ptr = omg;. Операция расшифровки, заставляет указатель выдать нам собственно объект на который он указывает, то есть переменную типа int (так как мы определили указатель на переменную int ).
Указатель может быть на любой тип данных, включая пользовательские, так же может указывать на массив. Существует такое понятие, как константный указатель. Выглядит это примерно так:
C++
1
const int *ptr;
в этом случае значение указателя ( адрес ) не может быть изменен, короче говоря, место в памяти, за определенным номером, занимаемое переменной типа int ( так как наш указатель, есть указатель на тип int ) изменено быть не может. Существует так же такое понятие, как указатель на константу и выглядит это так:
C++
1
int const *ptr;
в данном случае содержимое указателя изменено быть не может( то на что указывает указатель, в данном случае переменная типа int ), однако оно может быть помещено в другую область памяти, то есть может быть изменено значение указателя.

Существует так же такое понятие, как указатель на указатель, например:
C++
1
char **ptr;
таким образом определяем указатель на указатель типа char;
Можно, например, определить массив указателей на указатели:
C++
1
char** ptr[10];
имеем 10 указателей на char и таким образом можем внести в один массив 10 строк:
C++
1
*ptr[0] = " string 1 "; *ptr[1] = " string 2 ";
ну и собственно так далее. Такой синтаксис возможен, так как массив, обычный массив типа char (например), есть указатель на его первый элемент, то есть указатель, на область памяти, начиная с которой можно считывать данные, находящиеся в массиве.

Для вызова функции через указатель можно применять 2 операции. Допустим у нас есть некий класс ZOMG, и мы определили указатель на объект этого класса:
C++
1
2
ZOMG o1; 
ZOMG *ptr = &o1;
Теперь, чтобы вызвать любую функцию для объекта o1, на который указывает наш указатель ptr мы можем сделать так:
C++
1
2
3
*ptr.func( );
// или так:
ptr->func( );
Фактически, операция -> разыменовывает указатель и вызывает функцию, поэтому нам не нужно применять операцию * разыменования.

Для указателей существует две очень полезные операции: new и delete. Они позволяют динамически выделить память под объект и освободить её. Например:
C++
1
char* ptr = new char[10];
Такая команда выделяет память для массива типа char содержащего 10 символов, не больше, не меньше.
Так же мы можем выделить память для любых пользовательских данных, для объекта класса ZOMG, например:
C++
1
2
ZOMG o1;
ZOMG *ptr = new o1;
этой командой, мы выделяем памяти ровно столько, сколько достаточно для хранения одного экземпляра объекта класса ZOMG.
Чтобы освободить память, нам достаточно написать:
C++
1
delete ptr;
При работе с указателями следует быть осторожными, так как, если указатель не инициализировать какими - либо данными, он будет содержать в себе случайную область памяти и работа с таким указателем может привести к серьезным ошибкам в ОС.
Надеюсь, что то что я вам поведал поможет хоть как нибудь =)
 
Текущее время: 01:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru