Пример
АДРЕСА, УКАЗАТЕЛИ
Пример
Перегрузка функций
ПФ выполняет различные действия, зависящие от типов данных, передаваемых ей в качестве аргументов. Ф считается перегруженной, если два ее прототипа отличаются по количеству или типу аргументов, но имеют одно имя.
void repchar();
void repchar(char);
void repchar(char, int);
int main()
{
repchar();
repchar(‘=’);
repchar(‘+’, 30);
return 0;
}
void repchar()
{
for(int i=0; i<45; i++)
cout<<’*’;
cout<<endl;
}
void repchar(char ch)
{
for(int i=0; i<45; i++)
cout<<ch;
cout<<endl;
}
void repchar(char ch, int n)
{
for(int i=0; i<n; i++)
cout<<ch;
cout<<endl;
}
Указатели – спецобъекты С и С++: указатели-переменные и у.-константы.
Указатели на переменные и на функции отличаются в свойствах и правилах использования. УФ не допускают применения к ним АО.
type *имя_указателя;
обозначение_типа, операция_раскрытия_ссылки (или разыменования, или обращения по адресу), операнд этой унарной операции – идентификатор-указатель.
Например, float one, *two, * object, second;
При определении указатель можно инициализировать
|
|
type *name_pointer = выражение_инициализации;
type *name_pointer (выражение_инициализации);,
которым может быть
- адрес участка памяти
- указатель, уже имеющий значение
- выражение, позволяющее получить адрес объекта с помощью операции ‘&’
Например,
char cc = ‘d’;
char *pc = &cc;
char *ptr(NULL);
char *p;
#include<iostream>
using namespace std;
int main()
{
double a=1.;
double *ptr_a = &a;
cout<<a<<' '<<sizeof(a)<<' '<<ptr_a<<' '<<sizeof(ptr_a)<<' '<<*ptr_a<<endl;
return 0;
}
Переменные–указатели pc и ptr имеют разные права – к ptr нельзя обратиться как *ptr, он не связан ни с каким участком памяти, но после ptr=&cc уже можно - *cc и *ptr – синонимы имени cc.
Ошибочная запись - *p=’-‘; - Пытаемся что-то положить в неопределенный участок памяти.
Чтобы связать неинициализированный указатель с новым участком памяти, еще не занятым никаким объектом пишут
p = new char; или присвоить явный адрес
p = (char *)0xb80000000; при этом не забыть привести адрес к типу p.
После чего уже можно писать операторы вида cin>> *p;
Операцию ‘*’ разыменования указателя в выражении можно объяснить как – получение значения, размещенного по адресу, равному значению указателя. А ту же операцию, но в левой части оператора присваивания, как – разместить значение по адресу, равному значению указателя.
При определении указателя сам указатель и его значение могут быть объявлены константами.
type [const] * [const] имя_указателя [инициализатор];
Причем ближайший к имени указателя модификатор const относится к нему, а – ближайший к типу определяет постоянность начального значения, связанного с указателем.
Например, type const * имя_указателя [инициализатор]; - формат определения указателя на константу.
|
|
const int zero = 0;
int const *point_to_const = &zero;
//недопустимы операторы вида
*point_to_const = 1;
cin>>*point_to_const;
//допустимы
point_to_const = &cc;
point_to_const = NULL;
Ограничения использования операции взятия адреса - &
- Применима к объектам, имеющим имя и размещенным в памяти
- Нельзя применять к регистровым переменным, битовым полям структур и объединений, к внешним объектам (файлам)
Например,
&(23*f-6)
&2.71828
int register numb = 1;
int *ptr_numb = &numb;
const float Euler = 2.718282;
float *pEuler = (float *)&Euler;
Итак, ссылка – особый тип данных, являющийся скрытой формой указателя, который при использовании автоматически разыменовывается. При объявлении должна быть тут же проинициализирована именем того объекта, на который ссылается
type &name_ref = name_var;