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

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

04.01.2013, 16:05. Показов 10814. Ответов 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,035
Записей в блоге: 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,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru