Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 46

Указатели и ссылки c++

05.11.2013, 17:59. Показов 2983. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Не могли бы вы объяснить как можно использовать ссылки и указатели c++ на практике? Я не пойму для чего они нужны!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.11.2013, 17:59
Ответы с готовыми решениями:

Указатели и ссылки?
Ниже приведёна программы которая вызывает функцию. В функции происходит следующее создаются 2 массива в которые записыватся чётные и...

Ссылки, указатели
Доброго времени. Как, используя ссылки, указатели и, возможно, другие приемы сделать что-то вроде этого?: int a = 1; int b = 2; ...

Ссылки vs Указатели
Почему ссылки считаются более хорошим средством, чем указатели? Ведь если человек будет использовать сторонние классы, он может не...

10
120 / 120 / 47
Регистрация: 29.03.2013
Сообщений: 237
05.11.2013, 18:11
rome098, Передача аргументов в функцию, например
C++
1
2
3
4
5
6
7
8
9
10
void func(int value) {
    value=value+5;//создаётся копия переменной икс, которая увеличивается на 5
}
int main() 
{ 
    int x = 5;
    func(x);
    cout<<x; // x = 5;
return 0; 
}
C++
1
2
3
4
5
6
7
8
9
10
void func(int &value) {
    value=value+5; //передача по ссылке переменной x, уже изменяется сама переданная переменная
}
int main() 
{ 
    int x = 5;
    func(x);
    cout<<x; // x = 10;
    return 0;
}
Так же и указателями
C++
1
2
3
4
5
6
7
8
9
10
void func(int *value) {
    *value=*value+5;
}
int main() 
{ 
    int x = 5;
    func(&x);
    cout<<x; // x = 10
return 0; 
}
0
 Аватар для Anton_Kretov
89 / 51 / 15
Регистрация: 26.06.2013
Сообщений: 179
05.11.2013, 18:12
Указатель - это переменная, "указывающая" на какой-либо объект, к примеру, переменную типа int. Указатель обязательно должен иметь базовый тип, который как бы говорит, что "этот указатель может взаимодействовать только с переменными такого же типа данных". С помощью указателей можно совершать некие действия, к примеру:
C++
1
2
3
int a = 10;
int *ip; //Объявили указатель на int
ip = &a; //Теперь мы как бы сказали указателю, что "ты должен хранить в себе адрес памяти этой переменной"
Попробовав сделать такую инструкцию:
C++
1
cout << ip;
Получим число в шестнадцатеричной СС, которое будет в себе выражать адрес переменной в памяти.
Есть также и второй оператор - * (один из самых высоких приоритетов). К примеру, такой код:
C++
1
2
3
4
int a = 10;
int *ip = &a; //Тут все понятно, "привязали указатель".
//Теперь магия:
cout << *ip; //Тем самым, мы выведем в консоль значение переменной, на которую указывает указатель (простите за тавтологию).
Также мы можем совершать разные арифметические операции с указателями, как с его адресами, так и со значениями, к примеру, продолжая вышеописанный код:
C++
1
*ip++;
Сейчас мы сделали инкремент значения переменной на которую указывает указатель (вот опять...)

Огромное (для меня) преимущество указателей - их взаимосвязь с массивами, а также их использование в функциях. К примеру, такой код:
C++
1
2
3
4
5
int array[10];
//Тут типо рандомно заполнили его
int *ip = array;
//Если мы попытаемся вывести ip (БЕЗ ЗВЕЗДОЧКИ), то получим значение 0-ого элемента массива
cout << ip; //Получили
С массивами и указателями, а также с их взаимосвязью надо знать много, я описал основное, и то не все. В функциях указатели могут сыграть роль "посредника", так сказать. Раньше мы передавали в качестве аргументов определенные значения, которые становились локальными переменными и изменялись только внутри функции, но значения этих аргументов будут неизменны вне функции. Объявив параметр функции как указатель, мы будем работать в функции непосредственно с самой переменной (с самим аргументом, а не с его "локальной" копией в функции), а значит, что после инкрементирования значение указателя-параметра, изменится и значение передаваемой переменной в качестве аргумента-указателя.

P.S. Тут много не опишешь, почитайте в книге Шилтда "Базовый курс" или "Шаг за шагом", все подробно описано.
0
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 46
05.11.2013, 18:40  [ТС]
Цитата Сообщение от Anton_Kretov Посмотреть сообщение
int a = 10;
C++
1
2
int *ip; //Объявили указатель на int
ip = &a; //Теперь мы как бы сказали указателю, что "ты должен хранить в себе адрес памяти этой переменной"
Попробовав сделать такую инструкцию:
C++
1
cout << ip;
Получим число в шестнадцатеричной СС, которое будет в себе выражать адрес переменной в памяти.
1) Для чего тогда нужен этот адресс памяти?
2) какая разница будет если мы присвоем НЕ УКАЗАТЕЛЮ, а обычной переменной тот же адресс?
C++
1
2
int ip;
Ip = &a;
Добавлено через 6 минут
Цитата Сообщение от rome098 Посмотреть сообщение
1) Для чего тогда нужен этот адресс памяти?
2) какая разница будет если мы присвоем НЕ УКАЗАТЕЛЮ, а обычной переменной тот же адресс?
C++
1
2
int ip;
Ip = &a;
Только не int, а string. Меньше пямяти занимает?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.11.2013, 18:44
Цитата Сообщение от rome098 Посмотреть сообщение
Я не пойму для чего они нужны!
главным образом чтобы не создавать копию объекта. Мы можем просто сослаться на то место, где он храниться и работать с ним.

Добавлено через 30 секунд
Ссылка это фактически разыменованный указатель.

Добавлено через 2 минуты
Также, мы можем изменять объекты внутри функций. При передаче по значению мы лишь сможем работать с данными, но при выходе из тела функции, переданный объект как был так и останется и все изменения пропадут (они будут произведены с копией).
0
 Аватар для Anton_Kretov
89 / 51 / 15
Регистрация: 26.06.2013
Сообщений: 179
05.11.2013, 18:47
Цитата Сообщение от rome098 Посмотреть сообщение
1) Для чего тогда нужен этот адресс памяти?
2) какая разница будет если мы присвоем НЕ УКАЗАТЕЛЮ, а обычной переменной тот же адресс?
C++
1
2
int ip;
Ip = &a;
Добавлено через 6 минут

Только не int, а string. Меньше пямяти занимает?
Адрес памяти нужен лишь программе, точней, компилятору, который будет знать, с каким объектом работает указатель.
А про string я не понял. Если вы имеете в виду, что больше памяти занимает - string или int, то узнайте кол-во занимаемых байт на 1 объект.
1
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 46
05.11.2013, 18:48  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
главным образом чтобы не создавать копию объекта. Мы можем просто сослаться на то место, где он храниться и работать с ним.

Добавлено через 30 секунд
Ссылка это фактически разыменованный указатель.

Добавлено через 2 минуты
Также, мы можем изменять объекты внутри функций. При передаче по значению мы лишь сможем работать с данными, но при выходе из тела функции, переданный объект как был так и останется и все изменения пропадут (они будут произведены с копией).
Хорошо, спасибо! Я понял!
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
25.01.2020, 20:00
Здравствуйте,

Подскажите пожалуйста, почему в этом случае:

C++
1
2
int* point1 = new int;
cout << point1 << endl;
Выводится адрес в привычном 16-ричном виде типа: 00C4B500

А в этом случае:
C++
1
2
char* point2 = new char;
cout << point2 << endl;
Что то непонятное типа: НээээЭЭЭF2?G

Почему так ?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
25.01.2020, 20:06
Optimus11,
Вы же уже задавали такой вопрос:
Вывод адреса для типов int* и char*

Добавлено через 2 минуты
И еще одна ваша тема на этот счет: Указатели и new
Это что, троллинг такой?
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.01.2020, 20:09
Цитата Сообщение от Optimus11 Посмотреть сообщение
Почему так ?
Повезло)
Оператор сдвига в поток вывода << типов char * , const char перегружен для последовательного вывода символов вплоть до нуля-терминатора. В вашем разе терминатор оказался 8-м. Сам указатель лучше сначала к void* привести, а потом распечатать
C++
1
2
har* point2 = new char;
cout << ((void*)point2) << endl;
Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Это что, троллинг такой?
Жаль не знал.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
25.01.2020, 20:15
Цитата Сообщение от DrOffset Посмотреть сообщение
Optimus11,
Вы же уже задавали такой вопрос:
Вывод адреса для типов int* и char*

Добавлено через 2 минуты
И еще одна ваша тема на этот счет: Указатели и new
Это что, троллинг такой?
Извините, скорее помутнение.

Добавлено через 57 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Optimus11,
Вы же уже задавали такой вопрос:
Вывод адреса для типов int* и char*

Добавлено через 2 минуты
И еще одна ваша тема на этот счет: Указатели и new
Это что, троллинг такой?
Извините, скорее помутнение.:
Больше не повторится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2020, 20:15
Помогаю со студенческими работами здесь

Ссылки и указатели
#include &lt;iostream&gt; using namespace std; int main() { int *n=new int{1,2}; cout&lt;&lt;&amp;n&lt;&lt;' '&lt;&lt;&amp;n&lt;&lt;' '&lt;&lt;&amp;n&lt;&lt;endl; return...

Ссылки и указатели
Добрый день, не могу понять чем помогают при использовании указатели и ссылки? Есть код на c++ #progma once class well { ...

Указатели и ссылки [С++]
Всем привет. я тут программу делаю. Цель: определить,принадлежит ли точка заданному промежутку(а точнее лежит внутри или снаружи фигуры)....

Ссылки и указатели
Всем привет. Совсем запутался с ссылками и указателями. Помогите решать задачку: Функция принимает два аргумента, число с плавающей...

Указатели и ссылки
Экспериментируя с указателями пришел к вот таким выводам: int a; //переменная int *b; //указатель int &amp;c = a //ссылка на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru