Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3

Почему поинтер обнуляется ?

30.04.2019, 02:01. Показов 8293. Ответов 118
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>
 
 
int main()
{
 char* p = (char*)malloc(strlen("Thunderbird") + 1);
  strcpy(p, "Thunderbird");
for ( ; *p; ++p) if(*p > 'Z') {continue;} else if (*p < 'A') {continue;} else {*p = *p|0x60;}
 
printf ("str3 = %s ",p);
}
почему for обнуляет вместо того чтобы присвоить ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.04.2019, 02:01
Ответы с готовыми решениями:

Почему все обнуляется???
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; // прототипы функций void input ( float , char); void raschet ( float , float ,...

Почему мой указатель обнуляется?
Почему мой указатель обнуляется на какой-то итерации? задача: Функцию, которая возвращает среднее геометрическое элементов столбца и...

Почему не обнуляется указатель через функцию?
В функцию передаю указатель на целое число, хочу удалить память а сам указатель установить в NULL. Но он не устанавливается. Если все...

118
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
09.05.2019, 15:01
Цитата Сообщение от alexbmd Посмотреть сообщение
а онлайн есть ? линк?
Здесь запрещены ссылки на варез. Поищите сами, она есть в сети.

Цитата Сообщение от alexbmd Посмотреть сообщение
или кроме стэка и кучи можно другую память выделить/назначиь ?
Можно. Еще есть статическая память.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
09.05.2019, 15:14  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
arr2 это один константный указатель на массив int
ну просто вот так я могу его закастить
int *p = (int*)arr2;
думал может есть хитрая комбинация и в *p[] его закастить
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.05.2019, 15:16
Цитата Сообщение от alexbmd Посмотреть сообщение
ну просто вот так я могу его закастить
int *p = (int*)arr2;
лучше так:
C++
1
int* p = static_cast<int*>(*arr2);
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
09.05.2019, 15:17  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно. Еще есть статическая память.
ну это когда строка или когда const int = 5 ? это понятно.
вообще нашёл что их 5
По поводу области памяти: их вообще 5 — константные данные, стек, свободная динамическая память, куча, глобальная/статическая.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
09.05.2019, 15:27
alexbmd,
куча и динамическая память - это одно и то же.
в статической памяти располагаются глобальные переменные, статические переменные класса, статические локальные переменные.
у константных данных времени компиляции нет размещения в памяти вообще.
остальные константные данные могут иметь разное размещение: и в стеке, и в статической памяти, и в куче.
Примеры:
C++
1
2
3
4
5
6
7
8
9
10
11
12
const double a = 3.14; // static storage
 
int main()
{
     static const double b = 9.8; // static storage
 
     const double c = 3.14; // automatic storage - стек
 
     const double * p = new const double(3.14); // dynamic storage - куча
     
     // delete p;
}
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
09.05.2019, 15:37  [ТС]
DrOffset, спасибо , доходчиво
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
09.05.2019, 16:08
Цитата Сообщение от alexbmd Посмотреть сообщение
константные данные
Вообще, строковые литералы, которые были приведены в вашей цитате, имеют статический класс хранения, т.к. с точки зрения С++ располагаются в статической памяти. Т.к. литерал константен - попытка его изменения приводит к неопределенном поведению. На практике, в большинстве реализаций статическая память таких констант и статическая память для других, изменяемых переменных - разная. Физически, в исполняемом файле они реализованы с помощью разных сегментов (небольшой обзор есть здесь). Нужно понимать, что автор процитированных строк описывает С++ и реализацию вместе, чтобы у читателя сложилось комплексное понимание, жертвуя при этом некоторыми тонкостями теории. Поэтому "константные данные" у него выделены отдельно.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
09.05.2019, 16:54  [ТС]
спасибо. интересное дополнение.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
13.05.2019, 16:50  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
for (char* pp(p); *pp; ++pp)
DrOffset, в 3ем издание пишут это неявная инициализация. в 5ом вообще ничего не пишут просто что можно объявлять так int p(0);

кстати хотел спросить какой сокральный смысл в ++pp. ведь результат такой же как и рр++. и адрес после из выхода из фора одинаков в обоих случаях ?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.05.2019, 17:03
Цитата Сообщение от alexbmd Посмотреть сообщение
какой сокральный смысл в ++pp
так быстрее, потому что:
Code
1
2
3
4
5
type*& operator++(type*& p)//префиксный
{ p+=sizeof(type); return p; }
 
type* operator++(type*& p, int)//постфиксный
{ type* ret = p; p+=sizeof(type); return ret; }
2
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
13.05.2019, 19:50
Цитата Сообщение от alexbmd Посмотреть сообщение
пишут
Ну это книга для начинающих. Обозначили, что так можно писать - этого достаточно. Вы говорили в книгах не видели, я вам дал пример книги, где это есть.

Более подробно этот вопрос освещается в книге следующего уровня: "Решение сложных задач на С++", - Г. Саттер, глава 10.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
14.05.2019, 16:32  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
{ p+=sizeof(type); return p; }
объясните пожалуйста как при передачи int 0 мы получим 1 если sizeof int = 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename T>
T pre(T& p)
{
p+=sizeof(T); 
return p;
}
 
int main()
{
int i=0;
i = pre(i);
printf ("%d \n", i); //4
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.05.2019, 16:40
Цитата Сообщение от alexbmd Посмотреть сообщение
{ p+=sizeof(type); return p; }
вы на это не смотрите, это я типо арифметику указателя изобразил, на самом деле компилятор её знает

C++
1
2
3
4
5
6
7
8
9
T& operator++(T& p)//префиксный
{ p+=T(1); return p; }
 
T operator++(T& p, int)//постфиксный
{ T ret = p; p+=T(1); return ret; }
 
int a = 1;
int b = a++; // b = 1, a = 2
int c = ++a; // c = 3, a = 3
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
14.05.2019, 17:02
Цитата Сообщение от alexbmd Посмотреть сообщение
кстати хотел спросить какой сокральный смысл в ++pp. ведь результат такой же как и рр++. и адрес после из выхода из фора одинаков в обоих случаях ?
Результат? Именно результат как раз таки разный. В первом случае результатом будет новое значение, во втором - старое. Это побочный эффект у них одинаковый.

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

Цитата Сообщение от alexbmd Посмотреть сообщение
объясните пожалуйста как при передачи int 0 мы получим 1 если sizeof int = 4
Никак не получим. Откуда взялся такой вопрос? Откуда вообще взялось упоминание 1?

Добавлено через 3 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
так быстрее, потому что:
Для фундаментальных типов никакого "так быстрее" не будет, но в общем случае использование префиксной формы может быть хорошей привычкой именно по этой причине.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
14.05.2019, 17:15  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
T operator++(T& p, int)//постфиксный
простите а зачем второй аргумент int если мы передаем только один?

Добавлено через 8 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Результат?
резултат принта то что в {} в обоих случаях да одинаковый.
разница появляется только если во втром аргументе фора инкремент установить. for (;++x<10; )
кстати на каком именно шаге включается в работу третий аргумент ? for(;;++x) когда инкремент происходит ? в конце тела цикла ? когда дошли до } ?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Откуда вообще взялось упоминание 1
i=0;
i++; //1
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.05.2019, 17:22
Цитата Сообщение от alexbmd Посмотреть сообщение
простите а зачем второй аргумент int если мы передаем только один?
что бы отличать постфиксный от префиксного
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13206 / 6841 / 1822
Регистрация: 18.10.2014
Сообщений: 17,302
14.05.2019, 17:30
Цитата Сообщение от alexbmd Посмотреть сообщение
резултат принта то что в {} в обоих случаях да одинаковый.
Ну вы уже определитесь, о чем именно вы говорите. Сначала речь шла о результате ++. Теперь вдруг внезапно зашла речь о "резултат принта то что в {}". Так о чем все таки речь: о результате ++ или о "резултат принта то что в {}"?

Цитата Сообщение от alexbmd Посмотреть сообщение
кстати на каком именно шаге включается в работу третий аргумент ? for(;;++x) когда инкремент происходит ? в конце тела цикла ? когда дошли до } ?
У вас нет книги по элементарным азам языка? Третий сегмент из заголовка for выполняется в конце каждой итерации.

Цитата Сообщение от alexbmd Посмотреть сообщение
i=0;
i++; //1
К чему это здесь? Какое это имеет отношение к тому коду, о котором вы задавали вопрос??? Цитирую еще раз

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename T>
T pre(T& p)
{
p+=sizeof(T); 
return p;
}
 
int main()
{
int i=0;
i = pre(i);
printf ("%d \n", i); //4
}
Где вы в этом коде увидели ++?

Добавлено через 3 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
так быстрее, потому что:
Код
C++
1
2
3
4
type*& operator++(type*& p)//префиксный
{ p+=sizeof(type); return p; }
type* operator++(type*& p, int)//постфиксный
{ type* ret = p; p+=sizeof(type); return ret; }
Что за белиберда? Что здесь делает sizeof(type)???
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
14.05.2019, 17:34  [ТС]
TheCalligrapher,
я спросил Почему поинтер обнуляется ?
касательно этого поста https://www.cyberforum.ru/cpp-... 33650.html

Добавлено через 2 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что здесь делает sizeof(type)
Заяц опечатался. по переписке вопрос-ответ видно

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
что бы отличать постфиксный от префиксного
понял спасибо
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.05.2019, 17:45
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что за белиберда? Что здесь делает sizeof(type)???
это псевдокод, я просто показал, как это выглядело бы, если бы компилятор не знал правил арифметики указателей, и работал бы с указателями как с целочисленными типами
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
14.05.2019, 17:55  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"так быстрее" не будет
почему? если префиксный инкремент две инструкции а пост инкремент три.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.05.2019, 17:55

В определенный момент массив почему-то обнуляется
Вот листинг: #include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; double _AverageGain; void main() { int Digit; ...

Почему во время чтения из файла переменная row_i в цикле постоянно обнуляется?
Имеется следующий код: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main () { char row;

Переполнение знаковых целых чисел: почему значение переменной обнуляется, а не записывается младшее значение?
что то не пойму, как происходит переполнение знаковых целых чисел вот #include &lt;iostream&gt; int main(int argc, char* argv) ...

Почему массив не обнуляется
Не знаю почему массив не обнуляется. #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;clocale&gt; ...

Не обнуляется таймер почему-то
procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:=True; Form1.Button1.Enabled:=False; ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru