Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 1
Регистрация: 01.12.2015
Сообщений: 58

Объянить нюансы работы указателей

18.12.2015, 20:56. Показов 1320. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Недавно познакомился с С++ и с понятием указателя в частности, но не совсем понимаю принцип работы.
Написал двусвязный список со след структурой
C++
1
2
3
4
5
struct x{
int inf;
x* next;
x* prev;
}
Т.е. как я понимаю, next & prev это указатели на память типа x.
А чем отличается от этого?
C++
1
2
3
4
5
6
struct x
    {
        int inf; 
        x *next; 
        x *prev; 
    };
В функции я передавал параметры след вида:
C++
1
func t(x* p){};
Кстати чем отличается от
C++
1
func t(x* &p){};
& же просто передает указатель на объект, а если речь об указатели то он не нужен?

И да, о записях типа
C++
1
2
(*p).inf; //и
p->inf;
В них есть принципиальное различие? Помню по ходу написания кода столкнулся с тем, что вроде как это не всегда эквивалентные записи.
И насчет указателей на указатели вида **p, зачем они могут вообще понадобится? Увидел в одном источнике о бинарных деревьях след запись:
C++
1
2
3
   *p = new(node);
(**p).Key = x;
 (**p).Count = 1;
чем отличается от
C++
1
2
3
   *p = new(node);
(*p).Key = x;
 (*p).Count = 1;
И насколько критично присваивать указателям NULL, а не nullptr? Где это можно выйти боком?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2015, 20:56
Ответы с готовыми решениями:

Нюансы синтаксиса и тонкости использования указателей и массивов
Доброго времени суток! Никак не могу понять, почему один вариант кода работает: #include <iostream> #include <stdlib.h> ...

Объяснить нюансы использования указателей, массивов и ссылок в функциях
Здравствуйте. Скажите, а что выводит arry значения элемента массива или его адрес? А как понимать что функция возвращает ссылку на int?...

Нюансы арифметики указателей: преобразование к char* при вычислении сдвига
Добрый день! Вчера, при чтении темы возник вопрос различия между указателями и массивами. В теме дали почитать ссылку, где пишется...

10
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
18.12.2015, 23:33
Лучший ответ Сообщение было отмечено Creepy как решение

Решение

Цитата Сообщение от Creepy Посмотреть сообщение
А чем отличается от этого?
Ничем, положение * ни на что не влияет.

Добавлено через 4 минуты
Цитата Сообщение от Creepy Посмотреть сообщение
В функции я передавал параметры след вида:
C++
1
func t(x* p){};
Кстати чем отличается от
C++
1
func t(x* &p){};
В первом случае передаётся копия указателя (передача по значению), если адрес в указателе в функции меняется, то в оригинале изменения не сохранятся. Во втором случае передаётся ссылка на указатель (как бы, сам оригинал указателя), поэтому изменения значения указателя в функции будут сохранены.

Добавлено через 6 минут
Цитата Сообщение от Creepy Посмотреть сообщение
И да, о записях типа
C++
1
2
(*p).inf; //и
p->inf;
В них есть принципиальное различие? Помню по ходу написания кода столкнулся с тем, что вроде как это не всегда эквивалентные записи.
Принципиальных различий нет. В первом случае: доступ к данным через объект, во втором случае: доступ к данным через указатель на объект. Второй способ лаконичнее.

Добавлено через 5 минут
Цитата Сообщение от Creepy Посмотреть сообщение
И насчет указателей на указатели вида **p, зачем они могут вообще понадобится?
Могут использоваться при передаче указателя в функцию, равнозначно передаче указателя по ссылке (изменения сохранятся). Адрес памяти под массивом указателей хранить (двумерные, динамически создаваемые массивы).

Добавлено через 2 минуты
Цитата Сообщение от Creepy Посмотреть сообщение
И насколько критично присваивать указателям NULL, а не nullptr? Где это можно выйти боком?
Трудно сказать. По мне, так без разницы: что 0, что NULL, что nullptr.

Добавлено через 4 минуты
Цитата Сообщение от Creepy Посмотреть сообщение
C++
1
2
3
*p = new(node);
(**p).Key = x;
(**p).Count = 1;
чем отличается от
C++
1
2
3
*p = new(node);
(*p).Key = x;
(*p).Count = 1;
Второй код неверный. Правильно так будет:
C++
1
2
3
*p = new(node);
(*p) ->Key = x;
(*p) ->Count = 1;
2
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
18.12.2015, 23:53
Цитата Сообщение от Creepy Посмотреть сообщение
И насколько критично присваивать указателям NULL, а не nullptr?
NULL - это сугубо сишная фигня, в С++ доступна только для совместимости. К тому же это макрос, а макросы в С++ не рекомендуется использовать, это еще более сугубо сишная фигня. Сам старик Страуструп запретил NULL применять и сильно ругается на него.
2
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.12.2015, 23:55
Цитата Сообщение от Creepy Посмотреть сообщение
И насколько критично присваивать указателям NULL, а не nullptr? Где это можно выйти боком?
nullptr - ключевое слово, но работает только в C++11.
NULL - не ключевое слово, а define. То есть, требует include в недрах которого этот define запрятан. Критично разве что в ситуации "создай exe-шник самого минимального размера" (где все стандартные библиотеки нещадно вырезаются).
0 - может быть и нулевым указателем, и числом. Что может приводить к глюкам в недрах шаблонов выводящих типы аргументов налету (вы подразумевали указатель, а шаблон подумал что это число).
2
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
19.12.2015, 01:54
Цитата Сообщение от Renji Посмотреть сообщение
0 - может быть и нулевым указателем, и числом. Что может приводить к глюкам в недрах шаблонов выводящих типы аргументов налету (вы подразумевали указатель, а шаблон подумал что это число).
Renji, если не трудно, какой-нибудь простой пример для иллюстрации.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.12.2015, 09:39
Цитата Сообщение от nord_v Посмотреть сообщение
Renji, если не трудно, какой-нибудь простой пример для иллюстрации.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<typename iterator_type,typename value_type>
void fill(iterator_type start,int size,const value_type&value)
{
    for(int i=0;i<size;++i)
        *start++=value;
}
int main()
{
    std::vector<void*>my_vector(10);
    //работает
    fill(my_vector.begin(),10,nullptr);
    //опс...
    fill(my_vector.begin(),10,0);
    return 0;
}
2
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
19.12.2015, 15:50
C++
1
2
3
    //опс...
    void* p = 0;
    fill(my_vector.begin(), 10, p);
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.12.2015, 23:03
Цитата Сообщение от nord_v Посмотреть сообщение
void* p = 0;
Собственно, NULL именно это и есть (что-то в духе #define NULL ((void*)0) ).
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,034
Записей в блоге: 1
19.12.2015, 23:10
Renji, в плюсах в NULL не будет приведения к void*. Причина этому проста - из void* неявный каст запрещен, то бишь если бы в макросе был каст к void*, то int * p = NULL ; тупо бы не скомпилировалось.
1
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
19.12.2015, 23:14
Цитата Сообщение от Renji Посмотреть сообщение
Собственно, NULL именно это и есть (что-то в духе #define NULL ((void*)0) ).
В студии так (скрин).
Миниатюры
Объянить нюансы работы указателей  
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,034
Записей в блоге: 1
19.12.2015, 23:17
Цитата Сообщение от nord_v Посмотреть сообщение
В студии так (скрин).
Другими словами #define NULL 0 для C++ и #define NULL ((void*)0) для C
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2015, 23:17
Помогаю со студенческими работами здесь

Объяснить нюансы работы препроцессора
Скажите, если препроцессор вещь не интеллектуальная ведь? Он просто работает на уровне текстовых файлов? Допустим, я в заголовочном...

Объяснить нюансы работы функции CreateDirectory()
что в даном куске кода обозначает 0 насколько я понял данный оператор создает папуку в месте a.w_str(), и еще для чего то параметр null ...

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

Нюансы работы стека при вызове функций
Добрый день! # include &lt;iostream&gt; int foo(int b,int w){ int y=b+3; return y; } int main(){ int c=2;

Объяснить назначение и нюансы работы функции strtok()
Что делает это? for (char *p = strtok(str, del); p; p = strtok(NULL, del)) а именно ; p; p = strtok(NULL, del))


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь 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. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru