Более подробно о ссылках

Пример

АДРЕСА, УКАЗАТЕЛИ

Пример

Перегрузка функций

ПФ выполняет различные действия, зависящие от типов данных, передаваемых ей в качестве аргументов. Ф считается перегруженной, если два ее прототипа отличаются по количеству или типу аргументов, но имеют одно имя.

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;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: