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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.84
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
04.01.2013, 16:05     Расскажите популярно про ссылки и указатели #1
Помогите разобраться со ссылками и указателями на различные объекты. Запутался вообще в них полностью. Когда читаю книгу про них, то вроде все понятно написано, но примеров для меня видимо не достаточно, что бы как то их различать. В итоге начинаю решать задачи и ни чего не выходит.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2013, 16:05     Расскажите популярно про ссылки и указатели
Посмотрите здесь:

Расскажите про new и delete в C++ C++
C++ Расскажите пожалуйста про флаги
C++ [C++]Ссылки и указатели?
C++ Указатели и ссылки [С++]
Ссылки vs Указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.01.2013, 17:43     Расскажите популярно про ссылки и указатели #82
taras atavin, так а причем тут натуральное число то. Мы говорим о перечислении и индексации. Вы понимаете, что индексом могут выступать не только цифры, но и слова, другие символы, и тд? А первый элемент как он был, так он и останется. И те же англичане перечисляют с единицы. Если верить wiki, то 0 за натуральное число принимается некоторыми зарубежными математиками в некоторых теоремах, не более.

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
По определению натуральное число - это число, которое может быть именно номером,
Да Вы что...
Натуральные числа (естественные числа) — числа, возникающие естественным образом при счёте (как в смысле перечисления, так и в смысле исчисления).
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 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
Ушёл с форума.
 Аватар для 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
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
05.01.2013, 17:46     Расскажите популярно про ссылки и указатели #85
Цитата Сообщение от taras atavin Посмотреть сообщение
фактически передаст один и тот же адрес.
для этого и нужны ссылки. А вообще, данная тема уже обсуждалось не так давно.
Лично я пытался разобраться в каких случаях под ссылку не выделяется память, но так и не нашел ответа. Наверное, зависит от компилятора и от его настроек.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 17:49     Расскажите популярно про ссылки и указатели #86
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да Вы что...
Натуральные числа (естественные числа) — числа, возникающие естественным образом при счёте.
Вот именно. Отрицательные числа долго объяснялись так:
Минус - это признак долга, то есть если количество чего либо отрицательно, то это величина долга.
. Так что количество может быть отрицательным, а отрицательные числа не натуральны всё равно.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
05.01.2013, 17:50     Расскажите популярно про ссылки и указатели #87
Croessmah, так а где сама main? В коде есть только строка ее вызова, а тела main'a то нету. Или это это трэйс?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.01.2013, 17:52     Расскажите популярно про ссылки и указатели #88
taras atavin, Ну как же по какому, по порядку, которому он расположен в контейнере ( в памяти в случае простых массивов ). В Вашем примере 0 выступает в качестве индекса, а не номера.

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

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Код с ссылками и с указателями. Найдите 10 отличий?
не, отличия должны быть (но конечно не обязаны). Там, где используется ссылка, скорее всего память под нее даже не будет выделена, а вот под указатель уже будет (в оптимизированом коде указатель может быть тоже выброшен). Сейчас немного занят, чуть позже ассемблер ковырну, покажу, что получилось.

gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
05.01.2013, 17:57  [ТС]     Расскажите популярно про ссылки и указатели #92
Парни, я рад что у вас завязался диалог, но ветку я создал для решения задач по теме.
Croessmah
05.01.2013, 17:58
  #93

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
в оптимизированом коде указатель может быть тоже выброшен
собственно об этом я и толкую - все зависит от конкретной ситуации.

Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
05.01.2013, 17:58     Расскажите популярно про ссылки и указатели #94
gomodril, им нужен был только повод , ты его предоставил)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.01.2013, 18:00     Расскажите популярно про ссылки и указатели #95
Цитата Сообщение от Toshkarik Посмотреть сообщение
В Вашем примере 0 выступает в качестве индекса, а не номера.
А я и идентифицирую элементы только индексом.
Croessmah
05.01.2013, 18:06
  #96
 Комментарий модератора 

Если кто хочет высказаться по теме, то высказывайтесь.
Не думаю, что наш спор будет полезен автору темы!
Оффтоп прекращаем
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
05.01.2013, 18:24  [ТС]     Расскажите популярно про ссылки и указатели #97
Croessmah, спасибо

Вот теперь я точно запутался.
По заданию нужно создать указатель на массив строк. Но в книге и Интернете не могу найти точное определение массива строк, все как то размыто. Если следовать логике, то массив строк состоит из строк, при этом каждая строка это массив символов. Значит массив строк это двумерный массив символов.
Я на правильном пути?
Kastaneda
05.01.2013, 18:40
  #98

Не по теме:

Последний раз поофтоплю - посмотрел ассемблерные результаты (не буду их приводить, опишу словами), код брал из поста Croessmah. Без оптимизации в дебаг режиме создались абсолютно идентичные коды, т.е. память под ссылку была выделена так же, как для указателя (что меня удивило). А вот с оптимизацией результат меня обрадовал - для обоих случаев был создан такой код

Assembler
1
2
xor     eax, eax
retn
для тех, кто не знает ассемблер поясню, создался такой код
C++
1
2
3
4
int main()
{
    return 0;
}
т.е. компилятор смог понять, что в коде происходит что-то совершенно не нужное, и результат ни где не используется и просто выкинул этот код Можно конечно задействовать результат и еще раз глянуть, что получится, но я так предположу - память не под ссылку не под указатель выделена не будет, результат посчитается на регистрах.
Подитожу все вышесказанное - отличие ссылки от указателя видна на уровне языка (в нашем случае С++). А во что это реально будет транслировано знает только компилятор, может разница и будет, а может и не будет, зависит от конкретного случая.

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
05.01.2013, 18:43     Расскажите популярно про ссылки и указатели #99
Цитата Сообщение от gomodril Посмотреть сообщение
Значит массив строк это двумерный массив символов.
Можно и так представить.
А можно, например, как указатель на массив char*
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 18:51     Расскажите популярно про ссылки и указатели
Еще ссылки по теме:

Популярно объясните про указатели C++
Пояснить про указатели и ссылки C++
Расскажите про IDE Intel Parallel Studio XE 2015 C++

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

Или воспользуйтесь поиском по форуму:
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
05.01.2013, 18:51  [ТС]     Расскажите популярно про ссылки и указатели #100
Цитата Сообщение от Croessmah Посмотреть сообщение
Можно и так представить.
А можно, например, как указатель на массив char*
Тогда я правильно наверное создавал ранее код:

C++
1
2
3
4
char* m_str_1[] = {"Kisa1",
        "Kisa2",
        "Kisa3"};
std::cout << "Указатель на массив строк 'm_str_1' = " << m_str_1 << endl;
Подкорректируйте как правильно будет, а то уже каша в голове.
Yandex
Объявления
05.01.2013, 18:51     Расскажите популярно про ссылки и указатели
Ответ Создать тему
Опции темы

Текущее время: 00:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru