Цель лекции: изучить
(рис 6.1) Представление одиночного и многочисленного перенаправленийВ случае одиночного перенаправления указатель содержит адрес некоторого участка памяти, содержащего определенное значение. В случае указателя на указатель реализуется многочисленное перенаправление: первый указатель содержит адрес второго, который в свою очередь содержит адрес участка памяти, содержащего некоторое значение.
Многочисленное перенаправление может и дальше расширяться. Но существует немного случаев, когда необходимо что-то более мощное, чем nb – это указатель на указатель типа float:
float **nb; /*nb – это не указатель на число с плавающей точкой, а указатель на указатель на вещественное число*/
Для получения доступа к значению, адресуемому указателем на указатель, следует применить оператор
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
int *p, x, **q;
x = 10;
p = x;
q = p;
printf("%d", **q); /* вывод значения х */
system("pause");
return 0;
}
Здесь р объявляется как указатель на целое, а q – это printf() выводит число 10 на экран.
Так как указатель – это объект в памяти, то можно определять
//цепочка указателей на указатели
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
int i=88;
int *pi=i;
int **ppi=pi;
int ***pppi=ppi;
cout << "\n***pppi = " << ***pppi;
system("pause");
return 0;
}
Ассоциативность pppi, затем к участку с адресом (*pppi)== , затем к (*, затем к (*pi)== i. С помощью скобок последовательность разыменований можно пояснить таким выражением *(*(*pppi))).
В языке С++ допустимы функции, количество параметров у которых при компиляции не фиксировано. Кроме того, до вызова функции могут быть неизвестными и типы параметров. Количество и тип параметров становится известным только в момент вызова, когда явно задан список
Синтаксис определения
тип имя (спецификация_явных_параметров,...){
тело_функции
}
где тип – тип, возвращаемого функцией значения; имя – спецификация_явных_параметров – список спецификаций параметров, количество и типы которых фиксированы и известны в момент компиляции. Эти параметры можно назвать обязательными.
После списка обязательных параметров ставится запятая, а затем многоточие (...), которое показывает, что дальнейший контроль соответствия количества и типов параметров при обработке вызова функции производить не нужно. При *p=k, где p – указатель, а k – обязательный параметр, можно получить адреса и всех остальных параметров: оператор k++; выполняет переход к следующему параметру списка. Еще одна сложность заключается в определении конца списка параметров, поэтому каждая функция с переменным числом параметров должна иметь механизм определения количества и типов параметров. Существует два подхода:
Пример 1. Найти сумму последовательности чисел, если известно количество чисел.
#include "stdafx.h"
#include <iostream>
using namespace std;
float sum(int k,...);
//явный параметр k задает количество чисел
int _tmain(int argc, _TCHAR* argv[]){
cout << "\n4+6=" << sum(2,4,6);
cout << "\n1+2+3+4=" << sum(4,1,2,3,4);
system("pause");
return 0;
}
float sum(int k, ...) {
int *p=k;//настроили указатель на параметр k
float s=0;
for(;k!=0;k--)
s+=*(++p);
return s;
}
Пример 2. Найти среднее арифметическое последовательности чисел, если известен признак конца списка параметров (цифра '0').
#include "stdafx.h"
#include <iostream>
using namespace std;
float arifm(int k, ...);
int _tmain(int argc, _TCHAR* argv[]){
cout << "\n(4+6)/2=" << arifm(4,6,0);
cout << "\n(1+2+3+4)/4=" << arifm(1,2,3,4,0);
system("pause");
return 0;
}
float arifm(int k, ...) {
int *p=k;//настроили указатель на параметр k
float s=*p; //значение первого параметра присвоили s
int i;
for(i=1;(*p)!=0;i++) //пока нет конца списка
s+=*(++p);
return s/(i-1);
}
Указатели придают мощь и изящность программному коду. Кроме того, они необходимы в большинстве программ. Но когда указатель содержит неправильное значение, он может вызвать наиболее трудно устранимую ошибку. Сам по себе указатель не вызывает никаких проблем. Проблемы возникают, когда выполняется какая-либо операция, использующая неправильный указатель, например, производится чтение или запись в неизвестный участок памяти. При чтении в худшем случае в результате будет прочитан "мусор". При записи можно затереть участки кода или данных. В результате этого при поиске ошибки можно найти ее совсем в другом месте. Не существует очевидного способа для разрешения проблем, связанных с указателями.
Поскольку ошибки с указателями приводят к ужасающим последствиям, то лучше этого не допускать. С этой целью здесь рассмотрены две наиболее общие ошибки.
Классическим примером ошибки с указателем является неинициализированный указатель. Например:
// программа некорректна
void main (){
int x, *p;
x = 10;
*p = x;
}
Данная программа присваивает значение 10 некоторому неизвестному участку памяти. Указатель p не получал адреса памяти, которую можно использовать. Следовательно, он содержит p, скорее всего, содержит "безопасный" адрес, не принадлежащий коду, данным, стеку или операционной системе. По мере роста программы растет и вероятность того, что неправильное использование указателя испортит жизненно важную часть программы. Неожиданно программа может зависнуть. Направление решения таких проблем совершенно очевидно: следует убедиться, что указатель указывает на некоторую
Следующая типичная ошибка возникает из-за недоразумений по использованию указателя. Например, следующая программа содержит ошибку:
// программа некорректна
void main (){
int x, *p;
x = 10;
p = x;
printf("%d",*p);
}
Вызов printf() не выводит значения x, которое равно 10, на экран. В результате возникает ошибка из-за неправильного
p = x;
Этот оператор присваивает значение 10 указателю р, который должен содержать адрес, а не значение. Для устранения ошибки следует написать
p = x;
Хотя С++ выдает предупреждения об ошибках в программе, они не всегда могут помочь. Данные типы ошибок могут потребовать окольных путей по их обнаружению. Поэтому следует быть внимательным. Тот факт, что указатели могут вызвать очень сложные ошибки при некорректном использовании, не имеет никакого отношения к устранению этих ошибок.
Многочисленное перенаправление – это адресация указателем адреса другого указателя, что в конечном итоге сводится к адресации участка памяти.
Необязательные параметры – это неизвестные на момент компиляции параметры в
Обязательные параметры – это известные на момент компиляции параметры в
Одиночное перенаправление – это адресация указателем некоторого участка памяти.
Указатель на указатель – это указатель, реализующий многочисленное перенаправление.
Функции с переменным числом параметров – это функции, полный список параметров у которых может быть неизвестен на момент компиляции программы.
Цель работы: изучить
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе данные различных типов (в соответствии с условиями задач), выполняет их обработку в соответствии с требованиями задания и выводит результат на экран. Ввод данных осуществляется с клавиатуры с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке С++.
Теоретические сведения.
Выполните приведенные ниже задания.
double. Функция должна возвращать адрес (значение указателя) той из переменных, адресуемых параметрами, которая имеет максимальное значение. В Pn(x)=anxn+an-1xn-1+...+a1x1+a0. Коэффициенты an,an-1,...,a0, аргумент x и коэффициенты передавайте в функцию с помощью списка параметров изменяемой длины. В Pn(x)=(...(anx+an-1)x+an-2)x+...+a1)x+a0.
Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами использования указателей на объекты и указателей на функции в языке С++. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, используя указатели на объекты и указатели на функции, а также функции в качестве
Следует реализовать каждое задание в соответствии с приведенными этапами:
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
Контрольные вопросы
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.