Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140

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

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

Студворк — интернет-сервис помощи студентам
Помогите разобраться со ссылками и указателями на различные объекты. Запутался вообще в них полностью. Когда читаю книгу про них, то вроде все понятно написано, но примеров для меня видимо не достаточно, что бы как то их различать. В итоге начинаю решать задачи и ни чего не выходит.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2013, 16:05
Ответы с готовыми решениями:

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

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

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

110
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 17:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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 Посмотреть сообщение
Как раз таки Вы.
Нет. По определению натуральное число - это число, которое может быть именно номером, англичане считают ноль натуральным числом, значит у них может быть номер, равный нолю. Поэтому то, что русские ноль натуральным числом не считают делает номер не однозначным.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 17:43
taras atavin, так а причем тут натуральное число то. Мы говорим о перечислении и индексации. Вы понимаете, что индексом могут выступать не только цифры, но и слова, другие символы, и тд? А первый элемент как он был, так он и останется. И те же англичане перечисляют с единицы. Если верить wiki, то 0 за натуральное число принимается некоторыми зарубежными математиками в некоторых теоремах, не более.

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
По определению натуральное число - это число, которое может быть именно номером,
Да Вы что...
Натуральные числа (естественные числа) — числа, возникающие естественным образом при счёте (как в смысле перечисления, так и в смысле исчисления).
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
05.01.2013, 17:45
Код с ссылками и с указателями. Найдите 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:
Так что...
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 17:46
Цитата Сообщение от Toshkarik Посмотреть сообщение
А первый элемент как он был, так он и останется.
Начальный элемент от слово "начало". Первый - это по какому признаку? С единичным индексом? Ну так это может быть индекс последнего элемента:
Pascal
1
c:array[-200..1] of char;
. Или с единичным номером? А тогда приходим к вопросу о том, может ли быть номером число ноль. Получается: однозначно идентифицирует элемент только индекс.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
05.01.2013, 17:46
Цитата Сообщение от taras atavin Посмотреть сообщение
фактически передаст один и тот же адрес.
для этого и нужны ссылки. А вообще, данная тема уже обсуждалось не так давно.
Лично я пытался разобраться в каких случаях под ссылку не выделяется память, но так и не нашел ответа. Наверное, зависит от компилятора и от его настроек.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 17:49
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да Вы что...
Натуральные числа (естественные числа) — числа, возникающие естественным образом при счёте.
Вот именно. Отрицательные числа долго объяснялись так:
Минус - это признак долга, то есть если количество чего либо отрицательно, то это величина долга.
. Так что количество может быть отрицательным, а отрицательные числа не натуральны всё равно.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
05.01.2013, 17:50
Croessmah, так а где сама main? В коде есть только строка ее вызова, а тела main'a то нету. Или это это трэйс?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.01.2013, 17:52
taras atavin, Ну как же по какому, по порядку, которому он расположен в контейнере ( в памяти в случае простых массивов ). В Вашем примере 0 выступает в качестве индекса, а не номера.

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

Не по теме:

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

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

Не по теме:

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

0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
05.01.2013, 17:58
gomodril, им нужен был только повод , ты его предоставил)
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.01.2013, 18:00
Цитата Сообщение от Toshkarik Посмотреть сообщение
В Вашем примере 0 выступает в качестве индекса, а не номера.
А я и идентифицирую элементы только индексом.
0
05.01.2013, 18:06
 Комментарий модератора 

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

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

Не по теме:

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

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

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
05.01.2013, 18:43
Цитата Сообщение от gomodril Посмотреть сообщение
Значит массив строк это двумерный массив символов.
Можно и так представить.
А можно, например, как указатель на массив char*
0
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
05.01.2013, 18:51  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Можно и так представить.
А можно, например, как указатель на массив char*
Тогда я правильно наверное создавал ранее код:

C++
1
2
3
4
char* m_str_1[] = {"Kisa1",
        "Kisa2",
        "Kisa3"};
std::cout << "Указатель на массив строк 'm_str_1' = " << m_str_1 << endl;
Подкорректируйте как правильно будет, а то уже каша в голове.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2013, 18:51

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

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

Расскажите пожалуйста про флаги
Доброго времени суток. Помогите пожалуйста разобраться с фалагми. Вот код: #include &lt;iostream&gt; #define ID_F 1001 #define ID_D...

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

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru