Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Rioter
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 19
#1

Указатели и ссылки - C++

28.04.2014, 00:03. Просмотров 333. Ответов 7
Метки нет (Все метки)

Экспериментируя с указателями пришел к вот таким выводам:

C++
1
2
3
4
5
6
7
8
9
10
11
int a; //переменная
int *b; //указатель
int &c = a //ссылка на <a>
 
...=a; // получим значение <a> 
...=&a; // получим адрес <a>
...=b; // получим адрес, хранящийся в <b>
...=*b; // получим значение, хранящееся по адресу <b>
...=&b; // получим адрес <b>
...=c; // получим значение <a> (или <c>)
...=&c; // получим адрес <a> (или <c>)
все ли я правильно понял?
как еще можно с ними обращаться?(может я упустил что-то важное)
и являются ли <a> и <c> одним и тем же? или это разные типы данных? или один и тот же, просто с разными именами по одному адресу?

Заранее спасибо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2014, 00:03     Указатели и ссылки
Посмотрите здесь:

Указатели и ссылки - C++
Собственно, не могу до конца осознать как это работает, вот пример из вики(комменты входят в пример) int n = 6; // Объявление...

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

Указатели и ссылки c++ - C++
Здравствуйте! Не могли бы вы объяснить как можно использовать ссылки и указатели c++ на практике? Я не пойму для чего они нужны!

Указатели и Ссылки - C++
извеняюсь,но никак не могу понять. int sum(int* inLeft, int* inRight) { if(inLeft == inRight) return *inLeft; ...

Ссылки и указатели - C++
Добрый день. Возможно было. В чем существенная разница между передачей данных в функцию по ссылке или указателю. В каких случаях вы бы...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6422 / 3061 / 303
Регистрация: 04.12.2011
Сообщений: 8,344
Записей в блоге: 3
28.04.2014, 01:01     Указатели и ссылки #2
Rioter, вроде неплохо для начала. Попробуйте в скобках писать ещё и тип того что получим.
В пунктах 10 и 11 (или c) лишнее. У с нет не собственного значения ни адреса, оно является псевдонимом (синонимом) имени a.
Теперь попробуйте разобраться с объявлением формальных параметров функций. Они отличаются по смыслу объявлениями в коде, тем что влияют на способ передачи аргументов.
Rioter
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 19
28.04.2014, 12:23  [ТС]     Указатели и ссылки #3
Спасибо за ответ) если с типом данных...

Со значением самых переменных, либо данных по адресу все понятно, значение зависит от типа переменной/указателя, главное не перепутать тип данных обращаясь через указатель.

А вот с адресом, мне не все ясно.

Число однозначно будет целым.
Ячейка памяти дробной не будет)
Также оно будет положительным.
То есть unsigned int?
НО. Если я не ошибаюсь что-то будет меняться в зависимости от архитектуры.
И еще одно НО. Если выводить адрес при помощи cout, то светится, если я не ошибаюсь, шестнадцатеричное число.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Теперь попробуйте разобраться с объявлением формальных параметров функций. Они отличаются по смыслу объявлениями в коде, тем что влияют на способ передачи аргументов.
Формальный параметр функции? Функция, понятно, параметр, понятно, но формальный? что это значит?
В общем контексте я понял что вы имели ввиду что-то вроде передачи адреса, и прием его ново объявленным указателем?
Вроде этого:

C++
1
2
3
4
5
6
7
8
9
10
void function(*_x){
   *_x=5.2; //меняем значение по принятому адресу
}
 
int main(){
   double x=3.33; //объявляем переменную и задаем значение
   function(&x); //передаем на нее адрес
   std::cout<<x; //выводим измененную переменную, здесь она должна быть 5.2
   return 0;
}
и прочие случаи применения указателей в аргументах функций?
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6422 / 3061 / 303
Регистрация: 04.12.2011
Сообщений: 8,344
Записей в блоге: 3
28.04.2014, 12:47     Указатели и ссылки #4
Цитата Сообщение от Rioter Посмотреть сообщение
Также оно будет положительным.
Значение будет целым, а знак для int может быть любым. Говоря о типе я пытался сказать другое, если Вы имели ввиду, что значение самого указателя (адрес) это тоже целое (положительное). Я имел в виду что:
C++
1
2
int &c = a //ссылка на <a> (int)
...=&a; // получим адрес <a> (int *)
//------------------------------
Цитата Сообщение от Rioter Посмотреть сообщение
Формальный параметр функции? Функция, понятно, параметр, понятно, но формальный? что это значит?
В объявлении функции в её скобках перечисляются формальные параметры: тип имя, тип имя...
В месте вызова на их местах, - имена переменных значения которых выступают в роли фактических аргументов.
Что касается кода для function, то всё верно.
А что будет если написать: cin>>&a;
Rioter
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 19
28.04.2014, 13:14  [ТС]     Указатели и ссылки #5
Цитата Сообщение от IGPIGP Посмотреть сообщение
Код C++
1
2
int &c = a //ссылка на <a> (int)
...=&a; // получим адрес <a> (int *)
Понял.

Цитата Сообщение от IGPIGP Посмотреть сообщение
В объявлении функции в её скобках перечисляются формальные параметры: тип имя, тип имя...
В месте вызова на их местах, - имена переменных значения которых выступают в роли фактических аргументов.
Фактический, формальный. Понял, запомнил.

Цитата Сообщение от IGPIGP Посмотреть сообщение
А что будет если написать: cin>>&a;
Внутренний голос подсказывает что так делать нельзя)))
Если и скомпилируется, то по идее мы введем адрес для переменной а.
Введем в десятичной или в шестнадцатеричной системе?
Что заменим? Теоретически так можно и синий экран наколдовать))))
И что останется по прошлому адресу?
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6422 / 3061 / 303
Регистрация: 04.12.2011
Сообщений: 8,344
Записей в блоге: 3
28.04.2014, 13:29     Указатели и ссылки #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Rioter Посмотреть сообщение
Внутренний голос подсказывает что так делать нельзя)))
Он прав) Потому что &a это значение адреса. Причём это rvalue, то есть если полностью, то выражение &a возвращает значение rvalue. Его можно присвоить переменной типа int *, но ему присвоить ничего нельзя, ведь нет памяти куда это можно сохранить. И это хорошо, так как Вы правы и здесь:
Цитата Сообщение от Rioter Посмотреть сообщение
И что останется по прошлому адресу?
Это правильный вопрос.
//-------------
Он актуален в случае когда речь идёт не о значении адреса, а о полноценном указателе (переменной), которая является lvalue. Тогда связь с переменной, адрес которой был в указателе, пропадает через этот указатель. И если других указателей туда же нет, то нет и никакой связи. Это не беда если речь идёт о стековой переменной той же видимости и несчастье если память для неё выделена динамически.
//--------
Всё между коментами пока неважно, если Вы незнакомы с динамическим выделением. В этом случае не забивайте голову пока. Потом успеете.
Rioter
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 19
28.04.2014, 13:55  [ТС]     Указатели и ссылки #7
Спасибо, добавили ясности. Благодарю за ответы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2014, 14:24     Указатели и ссылки
Еще ссылки по теме:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6422 / 3061 / 303
Регистрация: 04.12.2011
Сообщений: 8,344
Записей в блоге: 3
28.04.2014, 14:24     Указатели и ссылки #8
Rioter, рад если помог. А если запутал, то не намеренно. Вот еще немного путаницы напоследок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
using namespace std;
int main (){
int a = 5;
int &b = a;//Ok b ссылается на a
int &c = b;//c ссылается на b? не-а) c ссылается на a
cout<<c;//5
//это всё равно что int &c = a;
//то есть синтаксически "ссылка на ссылку" это ссылка на то на что ссылается ссылка
 
//С указателями, "указатель на указатель" и синтаксически и семантически значит одно и тоже:
int *pa=&a;//указатель хранящий адрес а
int **ppa=&pa;//указатель хранящий адрес указателя на а
 
//важно ещё то что можно написать
int *ptr_a;//переменная содержит случайное значение и к ней не стоит обращаться для чтения
//и потом
ptr_a=&a;//Ok занесли адрес
 
//а для ссылки запись
// int &ref_a; // не скомпилируется
//так как прсевдоним без имени неимеет смысла и поэтому ссылку можно объявить только
//совместно с инициализацией:
int &ref_a=a;
//Причём константную ссылку можно инициализировать литералом:
const int &ref_const=123;//
 
//а указатель на константу нет
//const int *p_const = 123;
//а вот так можно, но 
const int *ptr_hex_const =(int*)0xA123; 
int *ptr_hex =(int*)0xB123;
//забудьте последние 2 примера - это пригодится надолго (забыть в смысле))
 
//остально может пригодиться для понимания передачи аргументов в функции
//например того что указатель-параметр инициализируется адресом из указателя-аргумента (копирует его)
//а ссылка-параметр "инициализируется" не ссылкой, а значением
//на который ссылается ссылка-аргумент (фактически нет не инициализайии ни копирования)
system("pause");
return 0;
}
Потом ещё выделение памяти и массивы. Указатели на char. Указатели на сложные типы (структуры/классы). Укзатели на полиморфные объекты. И... приведения. Везде.
Так что это хорошо, что основательно вдумываетесь. Не торопитесь.
Придется много раз возвращаться на новом уровне и всегда будет интересно. Вот почему так важно сначала всё правильно разобрать. Удачи!
Yandex
Объявления
28.04.2014, 14:24     Указатели и ссылки
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru