Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/46: Рейтинг темы: голосов - 46, средняя оценка - 4.87
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140

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

04.01.2013, 16:05. Показов 10646. Ответов 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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 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 / 3205 / 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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Семь 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. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru