Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/56: Рейтинг темы: голосов - 56, средняя оценка - 4.66
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433

Указатели в с++ указывают только на адрес?

25.08.2015, 23:39. Показов 13210. Ответов 213
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например указатель int *p; Он может инициализироваться только адресом?(и ничем другим) например *p=&s
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2015, 23:39
Ответы с готовыми решениями:

Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив равны.
Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив - равны.

Указатели, адрес переменной
int main(коллеги!) Снова прошу меня поправить! Есть такой пример: int *ptr; // переменная - ptr, указывает на - int...

Указатели и ссылки. Как сохранить адрес?
Небольшая путаница с указателями и ссылками. Допустим,есть некий указатель p1, который указывает на экземпляр класса a1 в динамической...

213
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433
29.08.2015, 19:58  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от shmkv Посмотреть сообщение
Надо только первый элемент
То есть, надо указать любой элемент а там за ним передадутся последующие
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
29.08.2015, 20:01
Цитата Сообщение от AncientPenguin Посмотреть сообщение
Вообще null можно присвоить любое число, просто если такой адрес попадется будет бобо.
Вообще стоит исходить из конкретной реализации и контекста. Опять повторяюсь, обеспечить null для malloc - никаких проблем. В худшем случае пожертвуем небольшим кусочком памяти, который перекрывает null pointer.

Добавлено через 42 секунды
Цитата Сообщение от Aqua77 Посмотреть сообщение
То есть, надо указать любой элемент а там за ним передадутся последующие
Само по себе ничего не переедается.
0
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433
29.08.2015, 20:09  [ТС]
Цитата Сообщение от shmkv Посмотреть сообщение
Само по себе ничего не переедается.
Ну Вот функция в которую передаётся массив s. Передаются ведь все элементы а не первый.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char *strsave(char *s)
{
char *p;
p=(char *)malloc(strlen(s));
strcopy2(p,s);
return(p);
}
 
int main()
{
char s[max],t[max];
 
getline(s,max);
char *p=strsave(s); // Начиная с первого элемента пересылается вся строка каторую я ввёл?(или только 1 символ?)
printf("Save string=%s",p);
getch();
}
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
29.08.2015, 20:12
Цитата Сообщение от Aqua77 Посмотреть сообщение
Начиная с первого элемента пересылается вся строка каторую я ввёл?
Передается указатель. А уже в strsave ты по этому указателю можешь сделать, что хочешь: иожешь первый символ взять, а хочешь всю строку.
0
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433
29.08.2015, 20:23  [ТС]
Цитата Сообщение от shmkv Посмотреть сообщение
Передается указатель.
Передаётся указатель с адреса первого элемента до последнего.? Если так то всё логично
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
29.08.2015, 20:25
Цитата Сообщение от Aqua77 Посмотреть сообщение
Передаётся указатель с адреса первого элемента до последнего
Указатель не имеет "последнего адреса". Именно чтобы определить конец строки и придумали '\0' в конце.
0
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433
29.08.2015, 20:27  [ТС]
Всё всем спасибо я удовлетворён!
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
29.08.2015, 21:37
Отдаю свой голос древнему пингвину.
И переведу его мысль на русский.
Мебельный стул придуман умными людьми, чтобы на нём сидеть задницей.
А nullptr придуман как указатель в никуда.
Tо-есть cout<<(int)(*(nullptr)) пишет ошибка "Operand of * must be a pointer"
Такова логика создателей языка и стула.

Теперь внимание. Особо одарённые нестандартным мышлением товарищи утверждают что стул можно надеть на голову и носить по улице! И в доказательство своей изобретательности демонстрируют это.
А их коллеги приводят аргументом что nullptr указывает кудато (в 0 адресс программы) строку типа этой.
C++
1
cout << (int)(*((int*)nullptr));
И так хитро надурив компилятор заставляют его таки скомпилировать его это нечто.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
29.08.2015, 21:49
nefton, ну так nullptr это std::nullptr_t, а не указатель. Ежу понятно, что
Цитата Сообщение от nefton Посмотреть сообщение
Tо-есть cout<<(int)(*(nullptr)) пишет ошибка "Operand of * must be a pointer"
Другое дело, что после присваивания nullptr указателю, указатель не сменит тип на std::nullptr_t. Что ты этим показать и кого хотел удивить?

Добавлено через 2 минуты
И да, "null pointer value" существовал задолго до nullptr.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
29.08.2015, 21:56
Да, абсолютно согласен что указатель останется указателем.
но использование его nullptr значения иначе как для проверки на nullptr подобно ношению стула на голове.
можно, но умным мало кто назовёт.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
29.08.2015, 22:03
Цитата Сообщение от nefton Посмотреть сообщение
но использование его nullptr значения иначе как для проверки на nullptr подобно ношению стула на голове.
Ты, похоже, вообще не понимаешь дискуссии.
AncientPenguin утвержает, что после присвоения "null pointer value" в указателе "образуется" "пустота".
Я же утверждаю, что в указатель просто запишется значение "null pointer value" без всяких дополнительных выводов.

Добавлено через 1 минуту
И да, тут никто не призывает использовать nullptr не по назначению.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
29.08.2015, 22:10
Проблема, когда nullptr или 0 - это всегда указатель на память с адресом 0.
Например в OpenCL спокойно можно положить объект по адресу 0 - пусть это будет указатель ptr.
Как тогда нормально разруливать выражения типа ptr == nullptr? Сейчас в самых распространенных компиляторах это просто true.

Или вот как еще понимается код компиляторами:
C++
1
2
3
4
int* a = 0; // null pointer
int* b = reinterpret_cast<int*>(0); // null pointer
uintptr_t z = 0;
int* c = reinterpret_cast<int*>(z); // null pointer
Хотя в последней строке у нас должен быть не null pointer, а указатель на адрес 0.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
29.08.2015, 22:19
Цитата Сообщение от shmkv Посмотреть сообщение
AncientPenguin утверждает, что после присвоения "null pointer value" в указателе "образуется" "пустота".
Да, он утверждает абсолютно верно. Такова логика создателей языка С++. В языке С++ там пустота.
Например её нельзя (глупо) инкрементировать.
Разберём конкретно твой процессор и твою винду под которую твой компилятор компилирует твою программу.
там есть регистры.... и ещё регистры... рядом память... и ещё регистры... всё.
там нет области переменных, от ничего не знает про int, char, long.
он понятия не имеет что такое вообще этот указатель или ссылка.
регистры... и больше ничего.
рассмотрим теперь результат компиляции (ассемблерный листинг).
там уже можно интуитивно рассмотреть какието переменные. в какие ж регистры они попали тогдато или тогдато. а может переменная в нескольких регистрах быть. но это уже на уровне интуиции. в ассемблере нет понятия указатель!!!!!!!

Теперь уясняется? В с++ указатель указывающий на nullptr нельзя (моветон)(глупо) использовать иначе как для поверки на nullptr. (Да, я вижу что повторяюсь буква в букву)
Но можно посмотреть а что ж там физически лежит. Но это уже далеко не С++. Это надо посмотреть в регистр где ты думаешь (догадываешся) должен лежать по идее (твоей!) этот указатель.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
29.08.2015, 22:20
ct0r, это мне вопрос? Я сам не знаю. Я подобный еще задавал где-то в начале топика.

Добавлено через 1 минуту
nefton, мне кажется ты читаешь меня по диагонали. А по поводу "пустоты" - ну думайте, что хотите.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
29.08.2015, 23:54
Не, ну это уже садомазо какое-то. И охота вам тролля кормить? У меня один знакомый так говорил: "а спорим, ты меня не переспоришь?"
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.08.2015, 00:57
Цитата Сообщение от ct0r Посмотреть сообщение
Хотя в последней строке у нас должен быть не null pointer, а указатель на адрес 0.
Во второй тоже. Вариант с uintptr_t ничем принципиально не отличается от варианта b.
Цитата Сообщение от ct0r Посмотреть сообщение
Например в OpenCL спокойно можно положить объект по адресу 0
И такое практикуется? Можно пример использования без UB?
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
30.08.2015, 01:27
Цитата Сообщение от Tulosba Посмотреть сообщение
Во второй тоже. Вариант с uintptr_t ничем принципиально не отличается от варианта b.
Почему не отличается, когда отличается? http://stackoverflow.com/quest... -address-0

Цитата Сообщение от Tulosba Посмотреть сообщение
И такое практикуется? Можно пример использования без UB?
Примера не могу привести, сам с OpenCL дела не имел. Но несколько раз встречал обсуждение этого на форуме llvm. Думаю, что можно загуглить, если есть желание.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.08.2015, 01:58
Цитата Сообщение от ct0r Посмотреть сообщение
Почему не отличается, когда отличается?
Фишка в том как разворачивается сишное приведение типов:
C++
1
2
3
int* p1 = (int*)0; // равносильно static_cast<int*>(0), т.е. null pointer
int z = 0; 
int* p2 = (int*)z; // равносильно reinterpret_cast<int*>(z), т.е. нулевой адрес
В твоём варианте используется reinterpret_cast везде, поэтому разницы м/у "b" и "c" нет. В обоих случаях указатель на адрес 0.
2
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
30.08.2015, 02:52
Цитата Сообщение от Tulosba Посмотреть сообщение
В твоём варианте используется reinterpret_cast везде, поэтому разницы м/у "b" и "c" нет. В обоих случаях указатель на адрес 0.
И правда Надо быть внимательней.
0
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433
30.08.2015, 14:50  [ТС]
Цитата Сообщение от shmkv Посмотреть сообщение
А уже в strsave ты по этому указателю можешь сделать, что хочешь
Передаётся указатель адреса первого элемента strsave(&s[0]); Как тогда в функции strlen(s)+1 узнаёт размер всего массива. Если передаётся только адрес первого. Или ты хочешь сказать что (&s[0])-Это указатель всего массива, начинающегося с первого адреса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.08.2015, 14:50

Вычислить адрес верхушки стека, адрес следующей команды, адрес переменной, адрес которой содержится в BX
Помогите решить следующие задачи: 1.Вычислить адрес верхушки стэка. 2.Вычислить адрес следующей выполняемой программы. 3. Вычислить...

Указатели - почему pNext работает как ссылка на следующий адрес?
struct Node { int value; struct Node* pNext; // ссылка на следующий адрес }; struct AddressInfo { char name; char...

Массивы и Указатели: распечатать таблицу,содержащую имя переменной,ее значение и адрес
Условие:Написать программу,которая создает несколько переменных целого и вещественного типа,для каждой переменной создает указатель,а затем...

хочу только адрес страници
Вот я замечал порой заходя на сайт что, где нормально пишешь название сайта скажем www.aaa.com то на некоторых сайтах когда заходишь то...

Частный адрес, динамический адрес, статический адрес - какой у меня?
Привет. Открываем рубрику глупых вопросов. Я сижу с компьютера который подключен к интернету по кабелю, кабель от компьютера идёт к...


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

Или воспользуйтесь поиском по форуму:
200
Закрытая тема Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru