Топ контрибуторов
loading
loading
Знаете ли Вы, что

Лучшие IT работодатели регулярно просматривают рейтинги и профили пользователей в поисках кандидатов. Для корректного отображения ваших данных рекомендуем заполнить ваш профиль и добавить информацию о вас и вашей профессии.

Лента обновлений
ссылка Oct 22 23:24
Комментарий от alexcei88:
В вопросе переменная s даже не выводиться, а выводитьс...
ссылка Oct 22 17:46
Комментарий от AlexFurm:
Это UB, так можно вызывать только статические функции ч...
ссылка Oct 22 17:43
Комментарий от AlexFurm:
Любые битовые операции с signed это UB
ссылка Oct 21 20:30
Комментарий от yoori:
Любой вариант скомпилируется если компилировать не в конеч...
ссылка Oct 21 16:53
Добавлен вопрос в тест QA (Quality Assurance)
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 443368 / 2177510.

C++ for beginner:Указатели и ссылки

head tail Статья
категория
C++
дата02.02.2013
авторdenis762
голосов21

Ссылки:
Ссылка это "псевдоним" переменной. Ссылка инициализируется при объявлении, и изменению не подлежит.
Объявляется так:
тип &имя_ссылки = имя_переменной; тип ссылки и переменной должны быть одинаковыми.

Пример:

#include 
using
namespace std;
int main()
{
int a = 5; //объявляем переменную
int &p = a; /объявляем ссылку. теперь p это псевдоним a 
cout << a << ' ' << p << endl; //выведет 5 5
a = 6;
cout << a << ' ' << p << endl; //выведет 6 6
p = 7;
cout << a << ' ' << p << endl; //выведет 7 7
return
0;
}


Ссылку можно создать как аргумент в функции, чтобы из функции напрямую работать с переменной, которую в неё передали.
Пример:

#include 
using
namespace std;
void
func(int &p)
{
p++; //увеличиваем переданную переменную
}
 
int main()
{
int a = 5; //объявляем переменную
func(a); //передаём переменную.  
cout << a << endl; //покажет 6
return
0;
}

Также можно создать ссылку на функцию и вызвать её:

#include 
using
namespace std;
 
void
func(int s)
{
cout << s << endl;
}
 
int main()
{
void
(&rf)(int) = func;
func(123); //покажет 123
rf(321); //покажет 321
return
0;
}



Указатели:
Указатель очень похож на ссылку. Он тоже указывает на адрес в памяти, но его можно изменять (и не обязательно инициализировать при объявлении). Также он может быть равен нулю.
Объявляется так:
тип *имя_ссылки = &имя_переменной;
тип ссылки и переменной должны быть одинаковыми (с одним исключением, см ниже про *void).
&имя_переменной возвращает адрес этой переменной.
*имя_указателя - работает со значением
имя указателя - работает с адресом
Приведём примеры наподобие выше пред ставленых:

Раз:

#include 
using
namespace std;
int main()
{
int a = 5; //объявляем переменную №1
int *p = &a; /объявляем указатель.
cout << a << ' ' << *p << endl; //выведет 5 5
a = 6;
cout << a << ' ' << *p << endl; //выведет 6 6
*p = 7;
cout << a << ' ' << *p << endl; //выведет 7 7
 
int b = 8; //объявляем переменную №2
int *p = &b; /объявляем указатель. внимание - указатель остался тотже, но мы меняем адрес на который он указывает
cout << b << ' ' << *p << endl; //выведет 8 8
a = 9;
cout << b << ' ' << *p << endl; //выведет 9 9
*p = 10;
cout << b << ' ' << *p << endl; //выведет 10 10
return
0;
}


Два:

#include 
using
namespace std;
void
func(int *p)
{
(*p)++; //увеличиваем переданную переменную
}
 
int
main()
{
int
a = 5; //объявляем переменную
func(&a); //передаём переменую.  
cout << a << endl; //покажет 6
return
0;
}


Три:

#include 
using namespace std;
 
void func(int s)
{
cout << s << endl;
}
 
int main()
{
void (*rf)(int) = func;
func(123); //покажет 123
(*rf)(321); //покажет 321
return 0;
}


Теперь про вышесказанное исключение:
указатель может указзывать на void, тоесть:
void *имя указателя = &имя_переменной; Причём тип_переменно может быть абсолютно любым. Тоесть данный указатель не хранит размер переменной, а хранит только адрес.


Вобщем на этом всё, если статья понравится напишу продолжение, про динамические массивы и строки, а также немного подробнее про *void.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 21  loading...
lupus   vitalikrst1   d3tafaq   Sergey_Pugach86   tandriy88   powerless   scrash   Tristan   oxmap   GvinP   Aruy   dark13   Gurbych   Gekkey   a111111   Dasha51   the4th   vbereza   milcars   alexander_1296   DariaTsybr