Цель лекции: изучить классификацию
В языке С++ разрешено наряду со стандартными использование
Непосредственно производные типы. Эти типы являются производными от некоторых существующих типов, реализуя типы указателей, ссылки, функции
Составные производные типы. В группу составных
В некоторых программных кодах бывает удобно вводить новые обозначения имен отдельных используемых типов данных. Задавать новое имя типу можно с помощью ключевого слова typedef.
Синтаксис:
typedef Тип НовоеИмяТипа[Размерность];
Например:
typedef unsigned int UNIT; typedef char Msg[100];
Такое имя можно затем использовать так же, как и стандартное имя типа:
UNIT a,b,c;//переменные типа unsigned int Msg str[10];//массив из 10 строк по 100 символов
Рассмотрим тип указатель. Указатели являются специальными объектами в программах на С++. Они предназначены для хранения адресов памяти.
Рассмотрим пример (рис 4.1). Когда компилятор обрабатывает оператор определения переменной, например, int a=10;, то в памяти выделяется участок памяти в соответствии с int не менее 2 байтов и зависит от реализации). Все обращения к переменной a компилятор заменит на адрес области памяти, в которой хранится эта переменная. Операция a является операцией взятия адреса ее операнда.
(рис 4.1) Адресация в С++Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями.
Указатель – именованный объект, предназначенный для хранения адреса области памяти (объекта, непоименованной области оперативной памяти либо точки входа в функцию).
Указатель не является самостоятельным типом, он всегда связан с каким-то другим типом. Указатели делятся на две категории:
Эти категории указателей отличаются друг от друга свойствами и правилами манипулирования. Каждый указатель имеет соответствующий тип.
В общем случае синтаксис определения указателя на объект:
Тип*Описатель;
При определении указателя специфицируется имя указателя-переменной (в дальнейшем указатель) и тип объекта, на который он ссылается.
Тип задает тип объекта, адрес которого будет содержать определяемая переменная и может соответствовать базовому, пустому (свободному, родовому, то есть типу void ), перечислению, void ни на что не указывает, но обладает способностью указывать на область любого размера после его типизирования каким-либо объектом.
Описатель – это идентификатор, определяющий имя объявляемой переменной типа указатель или конструкция, которая организует непосредственно доступ к памяти.
Знак '*' является float с именем summa является 0012FF48, int с именем date является 0012FF54, char с именем ch является 0012FF63.
(рис 4.2) Адресация типов в С++Примеры определения указателей:
int *P; /*указатель Р может содержать адрес объекта типа int*/ float *s; /*указатель s может содержать адрес объекта типа float*/
Тип*ИмяУказателя;
где ИмяУказателя – идентификатор.
Например,
char *s; //переменная s – указатель на объект типа char
double *x; /*переменная х – указатель на объект типа
double, вещественного числа с плавающей
точкой удвоенной точности*/
int *k, *ff; //k, ff – указатели на объекты целого типа
int *p, y; /*р – указатель на объект типа int,
y – целочисленная переменная и не является
указателем*/
int x, *p; /*х – целочисленная переменная и не является
указателем,
р – указатель на объект типа int*/
Указатель может быть константой или переменной, а также указывать на константу или переменную.
Например:
int i;//целая переменная
const int ci=1; //целая константа
int *pi; //указатель на целую переменную
const int *pci; //указатель на целую константу
int *const cpi; //указатель-константа на целую переменную
const int *const cpc;
//указатель-константа на целую константу
При объявлении указателя его можно сразу проинициализировать (задать значение):
int *pi=i; //указатель на целую переменную
const int *pci=ci; //указатель на целую константу
int *const cpi=i;
//указатель-константа на целую переменную
const int *const cpc=ci;
//указатель-константа на целую константу
Если модификатор const относится к указателю (т.е. находится между именем указателя и *), то он запрещает изменение значения указателя, а если он находится слева от типа (т.е. слева от *), то он запрещает изменение значения, на которое указывает указатель.
Способы инициализации указателя
int a=5; int *p=a;
int *r=p;

char *cp=(char*)0х В800 0000;где
0х В800 0000 – шестнадцатеричная константа, ( char* ) – int *N=NULL; или int *N=0;
Спецификатор указателя при форматированном выводе
Если на экран необходимо вывести адрес, следует применять %p.
%p –
Этот printf() выводить на экран адрес, формат которого совместим с типом адресации, принятой в компьютере.
Операции с указателями
С указателями можно выполнять следующие операции:
sizeof(тип);sizeof(тип);Пример 1. Демонстрация ситуации, когда указатели различных типов указывают на одно и то же место в памяти. Однако при разыменовании получаются разные результаты.
// Выбор данных из памяти с помощью разных указателей
// Использование функций приведения типов
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
unsigned long L=12345678;
char *cp=(char*)L;
int *ip=(int*)L;
long *lp=(long*)L;
cout <<"\nL = "<<L;
cout <<"\nL = "<<L;
cout <<"\n*cp = "<<*cp;
cout <<"\n*ip = "<<*ip;
cout <<"\n*lp = "<<*lp;
system("pause");
return 0;
}
Пример 2.
//Операции над указателями
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
int a,c,b;
int *ca, *cb;
int *sa, *sb, *sc;
cout << "a = "; cin >> a;
cout << "b = "; cin >> b;
c=a+b;
sb=b;//инициализация указателей через взятие адреса
sa=a;
sc =c;
//присваивание указателю значения выражения
*sc = c+a-b;
ca=sa;//присваивание указателю значения другого указателя
cb=sb;
*sa=12;//присваивание указателю значения константы
cout << "\n*ca = " << *ca;
cout << "\n*sa = " << *sa;
cout << "\n*cb = " << *cb;
cout << "\n*sb = " << *sb;
cout << "\n*sc = " << *sc;
cout << "\nca = " << ca;
cout << "\ncb = " << cb;
cout << "\nsc = " << sc;
cout << "\na = " << a;
cout << "\nb = " << b;
cout << "\nc = " << c;
cout << "\na = " << a;
cout << "\nb = " << b;
cout << "\nc = " << c;
cout << "\n*a = " << *a;
cout << "\n*cb-*ca = " << *cb-*ca;
cout << "\n*cb+*ca = " << *cb+*ca;
*cb+=2; //сложение с константой
cout << "\ncb = " << cb;
cb++; //инкремент
cout << "\ncb = " << cb;
ca--; //декремент
cout << "\ncа = " << ca;
cout << "\ncb-ca = " << cb-ca;
system("pause");
return 0;
}
Указатели одного и того же типа можно сравнивать с помощью стандартных операций сравнения. При этом сравниваются значения указателей, а не значения величин, на которые данные указатели ссылаются.
Пример 3.
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
int x=10;
int y=10;
int *xptr=x;
int *yptr=y;
//сравниваем указатели
if (xptr == yptr)
cout << "Указатели равны\n";
else
cout << "Указатели неравны\n";
//сравниваем значения, на которое указывает указатель
if (*xptr == *yptr) {
cout << "Значения равны\n";
} else {
cout << "Значения неравны\n";}
system("pause");
return 0;
}
В приведенном примере результат первой операции сравнения будет ложным, а второй – истинным, поскольку переменные x и y имеют одно и то же значение.
Адрес объекта – это адрес области оперативной памяти, по которому хранится объект в соответствии с особенностями представления типа.
Инициализация указателя – это определение значения указателя.
Косвенная адресация – это обращение к области памяти не напрямую, по адресу, а через объект, которому в памяти соответствует определенный участок.
Непосредственно производные типы – это типы, которые являются производными от некоторых существующих типов, реализуя типы указателей, ссылки, функции
Переименование типов – это задание нового имени для существующего типа.
Производные типы данных – это типы, полученные на основе более простых
Разыменование – это операция получения значения объекта, адрес которого хранится в указателе;
Составные производные типы – это типы, являющиеся производными от различных существующих или ранее объявленных типов.
Указатель – это именованный объект, предназначенный для хранения адреса области памяти.
Указатель на константу – это указатель на такой объект, значение которого нельзя изменить в процессе выполнения программы.
Указатель-константа – это указатель, значение которого нельзя изменить в процессе выполнения программы.
Указатель-константа на константу – это указатель, для которого невозможно изменение как самого указателя, так и значения адресуемого объекта.
void указывает на область памяти любого размера. Цель работы: изучить классификацию
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе данные различных типов (в соответствии с условиями задач), выполняет их обработку в соответствии с требованиями задания и выводит результат на экран. Ввод данных осуществляется с клавиатуры с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке С++.
Теоретические сведения.
Ознакомьтесь с материалом лекции 4.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
double, указатель double * и указатель типа void *. Присвойте указателям адрес переменной. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указателей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса и разыменования *, выведите на печать значение выражения *имя_переменной.double. Определите указатели char *, int *, double *, void *, инициализируйте их Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами работы с указателями в языке С++. В отчете следует пояснить различия в использовании указателей разных типов, адресующих один и тот же участок памяти, и отразить основные случаи использования в программе указателя типа void *.
Следует реализовать каждое задание в соответствии с приведенными этапами:
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
Контрольные вопросы
void?void без Цель лекции: изучить классификацию
В языке С++ разрешено наряду со стандартными использование
Непосредственно производные типы. Эти типы являются производными от некоторых существующих типов, реализуя типы указателей, ссылки, функции
Составные производные типы. В группу составных
В некоторых программных кодах бывает удобно вводить новые обозначения имен отдельных используемых типов данных. Задавать новое имя типу можно с помощью ключевого слова typedef.
Синтаксис:
typedef Тип НовоеИмяТипа[Размерность];
Например:
typedef unsigned int UNIT; typedef char Msg[100];
Такое имя можно затем использовать так же, как и стандартное имя типа:
UNIT a,b,c;//переменные типа unsigned int Msg str[10];//массив из 10 строк по 100 символов
Рассмотрим тип указатель. Указатели являются специальными объектами в программах на С++. Они предназначены для хранения адресов памяти.
Рассмотрим пример (рис 4.1). Когда компилятор обрабатывает оператор определения переменной, например, int a=10;, то в памяти выделяется участок памяти в соответствии с int не менее 2 байтов и зависит от реализации). Все обращения к переменной a компилятор заменит на адрес области памяти, в которой хранится эта переменная. Операция a является операцией взятия адреса ее операнда.
(рис 4.1) Адресация в С++Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями.
Указатель – именованный объект, предназначенный для хранения адреса области памяти (объекта, непоименованной области оперативной памяти либо точки входа в функцию).
Указатель не является самостоятельным типом, он всегда связан с каким-то другим типом. Указатели делятся на две категории:
Эти категории указателей отличаются друг от друга свойствами и правилами манипулирования. Каждый указатель имеет соответствующий тип.
В общем случае синтаксис определения указателя на объект:
Тип*Описатель;
При определении указателя специфицируется имя указателя-переменной (в дальнейшем указатель) и тип объекта, на который он ссылается.
Тип задает тип объекта, адрес которого будет содержать определяемая переменная и может соответствовать базовому, пустому (свободному, родовому, то есть типу void ), перечислению, void ни на что не указывает, но обладает способностью указывать на область любого размера после его типизирования каким-либо объектом.
Описатель – это идентификатор, определяющий имя объявляемой переменной типа указатель или конструкция, которая организует непосредственно доступ к памяти.
Знак '*' является float с именем summa является 0012FF48, int с именем date является 0012FF54, char с именем ch является 0012FF63.
(рис 4.2) Адресация типов в С++Примеры определения указателей:
int *P; /*указатель Р может содержать адрес объекта типа int*/ float *s; /*указатель s может содержать адрес объекта типа float*/
Тип*ИмяУказателя;
где ИмяУказателя – идентификатор.
Например,
char *s; //переменная s – указатель на объект типа char
double *x; /*переменная х – указатель на объект типа
double, вещественного числа с плавающей
точкой удвоенной точности*/
int *k, *ff; //k, ff – указатели на объекты целого типа
int *p, y; /*р – указатель на объект типа int,
y – целочисленная переменная и не является
указателем*/
int x, *p; /*х – целочисленная переменная и не является
указателем,
р – указатель на объект типа int*/
Указатель может быть константой или переменной, а также указывать на константу или переменную.
Например:
int i;//целая переменная
const int ci=1; //целая константа
int *pi; //указатель на целую переменную
const int *pci; //указатель на целую константу
int *const cpi; //указатель-константа на целую переменную
const int *const cpc;
//указатель-константа на целую константу
При объявлении указателя его можно сразу проинициализировать (задать значение):
int *pi=i; //указатель на целую переменную
const int *pci=ci; //указатель на целую константу
int *const cpi=i;
//указатель-константа на целую переменную
const int *const cpc=ci;
//указатель-константа на целую константу
Если модификатор const относится к указателю (т.е. находится между именем указателя и *), то он запрещает изменение значения указателя, а если он находится слева от типа (т.е. слева от *), то он запрещает изменение значения, на которое указывает указатель.
Способы инициализации указателя
int a=5; int *p=a;
int *r=p;

char *cp=(char*)0х В800 0000;где
0х В800 0000 – шестнадцатеричная константа, ( char* ) – int *N=NULL; или int *N=0;
Спецификатор указателя при форматированном выводе
Если на экран необходимо вывести адрес, следует применять %p.
%p –
Этот printf() выводить на экран адрес, формат которого совместим с типом адресации, принятой в компьютере.
Операции с указателями
С указателями можно выполнять следующие операции:
sizeof(тип);sizeof(тип);Пример 1. Демонстрация ситуации, когда указатели различных типов указывают на одно и то же место в памяти. Однако при разыменовании получаются разные результаты.
// Выбор данных из памяти с помощью разных указателей
// Использование функций приведения типов
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
unsigned long L=12345678;
char *cp=(char*)L;
int *ip=(int*)L;
long *lp=(long*)L;
cout <<"\nL = "<<L;
cout <<"\nL = "<<L;
cout <<"\n*cp = "<<*cp;
cout <<"\n*ip = "<<*ip;
cout <<"\n*lp = "<<*lp;
system("pause");
return 0;
}
Пример 2.
//Операции над указателями
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
int a,c,b;
int *ca, *cb;
int *sa, *sb, *sc;
cout << "a = "; cin >> a;
cout << "b = "; cin >> b;
c=a+b;
sb=b;//инициализация указателей через взятие адреса
sa=a;
sc =c;
//присваивание указателю значения выражения
*sc = c+a-b;
ca=sa;//присваивание указателю значения другого указателя
cb=sb;
*sa=12;//присваивание указателю значения константы
cout << "\n*ca = " << *ca;
cout << "\n*sa = " << *sa;
cout << "\n*cb = " << *cb;
cout << "\n*sb = " << *sb;
cout << "\n*sc = " << *sc;
cout << "\nca = " << ca;
cout << "\ncb = " << cb;
cout << "\nsc = " << sc;
cout << "\na = " << a;
cout << "\nb = " << b;
cout << "\nc = " << c;
cout << "\na = " << a;
cout << "\nb = " << b;
cout << "\nc = " << c;
cout << "\n*a = " << *a;
cout << "\n*cb-*ca = " << *cb-*ca;
cout << "\n*cb+*ca = " << *cb+*ca;
*cb+=2; //сложение с константой
cout << "\ncb = " << cb;
cb++; //инкремент
cout << "\ncb = " << cb;
ca--; //декремент
cout << "\ncа = " << ca;
cout << "\ncb-ca = " << cb-ca;
system("pause");
return 0;
}
Указатели одного и того же типа можно сравнивать с помощью стандартных операций сравнения. При этом сравниваются значения указателей, а не значения величин, на которые данные указатели ссылаются.
Пример 3.
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
int x=10;
int y=10;
int *xptr=x;
int *yptr=y;
//сравниваем указатели
if (xptr == yptr)
cout << "Указатели равны\n";
else
cout << "Указатели неравны\n";
//сравниваем значения, на которое указывает указатель
if (*xptr == *yptr) {
cout << "Значения равны\n";
} else {
cout << "Значения неравны\n";}
system("pause");
return 0;
}
В приведенном примере результат первой операции сравнения будет ложным, а второй – истинным, поскольку переменные x и y имеют одно и то же значение.
Адрес объекта – это адрес области оперативной памяти, по которому хранится объект в соответствии с особенностями представления типа.
Инициализация указателя – это определение значения указателя.
Косвенная адресация – это обращение к области памяти не напрямую, по адресу, а через объект, которому в памяти соответствует определенный участок.
Непосредственно производные типы – это типы, которые являются производными от некоторых существующих типов, реализуя типы указателей, ссылки, функции
Переименование типов – это задание нового имени для существующего типа.
Производные типы данных – это типы, полученные на основе более простых
Разыменование – это операция получения значения объекта, адрес которого хранится в указателе;
Составные производные типы – это типы, являющиеся производными от различных существующих или ранее объявленных типов.
Указатель – это именованный объект, предназначенный для хранения адреса области памяти.
Указатель на константу – это указатель на такой объект, значение которого нельзя изменить в процессе выполнения программы.
Указатель-константа – это указатель, значение которого нельзя изменить в процессе выполнения программы.
Указатель-константа на константу – это указатель, для которого невозможно изменение как самого указателя, так и значения адресуемого объекта.
void указывает на область памяти любого размера. Цель работы: изучить классификацию
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе данные различных типов (в соответствии с условиями задач), выполняет их обработку в соответствии с требованиями задания и выводит результат на экран. Ввод данных осуществляется с клавиатуры с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке С++.
Теоретические сведения.
Ознакомьтесь с материалом лекции 4.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
double, указатель double * и указатель типа void *. Присвойте указателям адрес переменной. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указателей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса и разыменования *, выведите на печать значение выражения *имя_переменной.double. Определите указатели char *, int *, double *, void *, инициализируйте их Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами работы с указателями в языке С++. В отчете следует пояснить различия в использовании указателей разных типов, адресующих один и тот же участок памяти, и отразить основные случаи использования в программе указателя типа void *.
Следует реализовать каждое задание в соответствии с приведенными этапами:
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
Контрольные вопросы
void?void без Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.