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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.84
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 130
#1

Расскажите популярно про ссылки и указатели - C++

04.01.2013, 16:05. Просмотров 5198. Ответов 110
Метки нет (Все метки)

Помогите разобраться со ссылками и указателями на различные объекты. Запутался вообще в них полностью. Когда читаю книгу про них, то вроде все понятно написано, но примеров для меня видимо не достаточно, что бы как то их различать. В итоге начинаю решать задачи и ни чего не выходит.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2013, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Расскажите популярно про ссылки и указатели (C++):

Популярно объясните про указатели - C++
Что-то плохо даётся мне тема про указатели. Я хорошо уяснил, что вот так создаётся указатель: int *pointer; Я так же хорошо...

Пояснить про указатели и ссылки - C++
есть переменное и указатель.. Значение нашей переменной случайный адрес, Как менять адрес указателя, таким образом, что бы она стала...

Подскажите хорошую статью про указатели и ссылки - C++
Посоветуйте статью, видео или книгу по указателям и ссылкам в C++, где все доходчиво разъяснено с реальными примерами. Уже много чего...

Расскажите про new и delete в C++ - C++
Есть несколько вопросов: 1) Можно ли перегрузить несколько операторов new в разных пространствах имен, а потом просто писать int *t =...

Расскажите на пальцах про классы - C++
Доброе время суток! (сразу оговорюсь, можете кинуть ссылкой куда мне пойти почитать) Сижу разбираюсь в классах и собственно вопросы:...

Расскажите пожалуйста про флаги - C++
Доброго времени суток. Помогите пожалуйста разобраться с фалагми. Вот код: #include <iostream> #define ID_F 1001 #define ID_D 1002 ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
05.01.2013, 17:28 #76
Под имя массива так же не выделяется память. При трансляции имя заменится на адрес, а каждое обращение на адрес + смещение ( равный индексу в данном случае ).
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 17:29 #77
Цитата Сообщение от Croessmah Посмотреть сообщение
Пропустите через транслятор код с указателями и аналогичный код с ссылками - увидите разницу. Точнее её отсутствие.
А она не обязательна.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
05.01.2013, 17:30 #78
Цитата Сообщение от taras atavin Посмотреть сообщение
Обычно. Под arr же память уже выделена, под fff должна быть выделена та же память.
Да нет. В функцию же можно передать по ссылке что угодно, а значит не известно на какую память будет ссылаться ссылка. Значит нужно выделить память и под ссылку(под указатель на элемент)
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 17:31 #79
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы опять путаете индексацию, номер и перечисление.
Не я.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
05.01.2013, 17:31 #80
Цитата Сообщение от taras atavin Посмотреть сообщение
Не я.

Не по теме:

Как раз таки Вы.

taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 17:41 #81
Цитата Сообщение от Croessmah Посмотреть сообщение
В функцию же можно передать по ссылке что угодно, а значит не известно на какую память будет ссылаться ссылка.
Ссылка-параметр - это уже совсем другая ссылка и как раз она - надстройка над указателем, которому при передаче будет присвоен адрес оригинала, хоть его передавай, хоть ссылку, то есть:
C++
1
2
3
4
5
6
7
void f(int &x)
{
 ...
}
...
int a;
f(a);
и
C++
1
2
3
4
5
6
7
8
void f(int &x)
{
 ...
}
...
int a;
int &b=a;
f(b);
фактически передаст один и тот же адрес. Вот под этот указатель и будет выделена отдельная память, а его значением станет адрес всё равно фактического параметра, а не ссылки.

Добавлено через 2 минуты
Цитата Сообщение от Toshkarik Посмотреть сообщение
Как раз таки Вы.
Нет. По определению натуральное число - это число, которое может быть именно номером, англичане считают ноль натуральным числом, значит у них может быть номер, равный нолю. Поэтому то, что русские ноль натуральным числом не считают делает номер не однозначным.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
05.01.2013, 17:43 #82
taras atavin, так а причем тут натуральное число то. Мы говорим о перечислении и индексации. Вы понимаете, что индексом могут выступать не только цифры, но и слова, другие символы, и тд? А первый элемент как он был, так он и останется. И те же англичане перечисляют с единицы. Если верить wiki, то 0 за натуральное число принимается некоторыми зарубежными математиками в некоторых теоремах, не более.

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
По определению натуральное число - это число, которое может быть именно номером,
Да Вы что...
Натуральные числа (естественные числа) — числа, возникающие естественным образом при счёте (как в смысле перечисления, так и в смысле исчисления).
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
05.01.2013, 17:45 #83
Код с ссылками и с указателями. Найдите 10 отличий?
C++
1
2
3
4
5
6
7
int main(){
    int n;
    int &p=n;
    p=40;
    p+=10;
    return 0;
}
Assembler
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
    .file   "main.cpp"
    .def    ___main;    .scl    2;  .type   32; .endef
    .text
    .globl  _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    call    ___main
    leal    8(%esp), %eax
    movl    %eax, 12(%esp)
    movl    12(%esp), %eax
    movl    $40, (%eax)
    movl    12(%esp), %eax
    movl    (%eax), %eax
    leal    10(%eax), %edx
    movl    12(%esp), %eax
    movl    %edx, (%eax)
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE0:
C++
1
2
3
4
5
6
7
int main(){
    int n;
    int *p=&n;
    *p=40;
    *p+=10;
    return 0;
}
Assembler
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
    .file   "main.cpp"
    .def    ___main;    .scl    2;  .type   32; .endef
    .text
    .globl  _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    call    ___main
    leal    8(%esp), %eax
    movl    %eax, 12(%esp)
    movl    12(%esp), %eax
    movl    $40, (%eax)
    movl    12(%esp), %eax
    movl    (%eax), %eax
    leal    10(%eax), %edx
    movl    12(%esp), %eax
    movl    %edx, (%eax)
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE0:
Так что...
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 17:46 #84
Цитата Сообщение от Toshkarik Посмотреть сообщение
А первый элемент как он был, так он и останется.
Начальный элемент от слово "начало". Первый - это по какому признаку? С единичным индексом? Ну так это может быть индекс последнего элемента:
Pascal
1
c:array[-200..1] of char;
. Или с единичным номером? А тогда приходим к вопросу о том, может ли быть номером число ноль. Получается: однозначно идентифицирует элемент только индекс.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
05.01.2013, 17:46 #85
Цитата Сообщение от taras atavin Посмотреть сообщение
фактически передаст один и тот же адрес.
для этого и нужны ссылки. А вообще, данная тема уже обсуждалось не так давно.
Лично я пытался разобраться в каких случаях под ссылку не выделяется память, но так и не нашел ответа. Наверное, зависит от компилятора и от его настроек.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 17:49 #86
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да Вы что...
Натуральные числа (естественные числа) — числа, возникающие естественным образом при счёте.
Вот именно. Отрицательные числа долго объяснялись так:
Минус - это признак долга, то есть если количество чего либо отрицательно, то это величина долга.
. Так что количество может быть отрицательным, а отрицательные числа не натуральны всё равно.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
05.01.2013, 17:50 #87
Croessmah, так а где сама main? В коде есть только строка ее вызова, а тела main'a то нету. Или это это трэйс?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
05.01.2013, 17:52 #88
taras atavin, Ну как же по какому, по порядку, которому он расположен в контейнере ( в памяти в случае простых массивов ). В Вашем примере 0 выступает в качестве индекса, а не номера.

С Вашими терминами Вам в экономику нужно идти, а не в программисты.
Отрица́тельное число́ — элемент множества отрицательных чисел, которое (вместе с нулём) появилось в математике при расширении множества натуральных чисел. Цель расширения: обеспечить выполнение операции вычитания для любых чисел.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 17:52 #89
Цитата Сообщение от Croessmah Посмотреть сообщение
Лично я пытался разобраться в каких случаях под ссылку не выделяется память, но так и не нашел ответа. Наверное, зависит от компилятора и от его настроек.
Не найдёшь даже в стандарте, а любая тестовая прога обязана показать, что ни когда, даже если на самом деле ссылка реализована на указателе. Остаётся код смотреть.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 17:55 #90
Цитата Сообщение от Toshkarik Посмотреть сообщение
С Вашими терминами Вам в экономику нужно идти, а не в программисты.
Отрица́тельное число́ — элемент множества отрицательных чисел, которое (вместе с нулём) появилось в математике при расширении множества натуральных чисел. Цель расширения: обеспечить выполнение операции вычитания для любых чисел.
Я знаю, что такое отрицательное число и для этого мне не нужно понятие долга, но когда отрицательные числа были впервые придуманы, то далеко не все их сразу поняли и приходилось объяснять через долг, так как экономику тогда умудрялись знать хоть и плохо, но лучше, чем математику и незачем столь негативно воспринимать исторические справки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 17:55
Привет! Вот еще темы с ответами:

Расскажите про IDE Intel Parallel Studio XE 2015 - C++
Реклама на сайте Intel Parallel Studio XE 2015 написано хорошо, а тех кто пользовался стоит ли установить себе? Добавлено через...

Расскажите про "тру" метод парсинга строки - C++
Опять Добрый день!))) Ой как я ошибался говоря что с парсингом не будет проблем((( Код void GetDirList(const char *Target) { ...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.01.2013, 17:55
Ответ Создать тему
Опции темы

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