Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
alexbmd
0 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 77
Записей в блоге: 2
1

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

30.04.2019, 02:01. Просмотров 1334. Ответов 61
Метки нет (Все метки)

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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2019, 02:01
Ответы с готовыми решениями:

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

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

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

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

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

61
DrOffset
9917 / 5374 / 1315
Регистрация: 30.01.2014
Сообщений: 8,658
09.05.2019, 15:01 21
Цитата Сообщение от alexbmd Посмотреть сообщение
а онлайн есть ? линк?
Здесь запрещены ссылки на варез. Поищите сами, она есть в сети.

Цитата Сообщение от alexbmd Посмотреть сообщение
или кроме стэка и кучи можно другую память выделить/назначиь ?
Можно. Еще есть статическая память.
0
alexbmd
0 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 77
Записей в блоге: 2
09.05.2019, 15:14  [ТС] 22
Цитата Сообщение от zayats80888 Посмотреть сообщение
arr2 это один константный указатель на массив int
ну просто вот так я могу его закастить
int *p = (int*)arr2;
думал может есть хитрая комбинация и в *p[] его закастить
0
zayats80888
1166 / 624 / 279
Регистрация: 07.02.2019
Сообщений: 1,863
09.05.2019, 15:16 23
Цитата Сообщение от alexbmd Посмотреть сообщение
ну просто вот так я могу его закастить
int *p = (int*)arr2;
лучше так:
C++
1
int* p = static_cast<int*>(*arr2);
0
alexbmd
0 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 77
Записей в блоге: 2
09.05.2019, 15:17  [ТС] 24
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно. Еще есть статическая память.
ну это когда строка или когда const int = 5 ? это понятно.
вообще нашёл что их 5
По поводу области памяти: их вообще 5 — константные данные, стек, свободная динамическая память, куча, глобальная/статическая.
0
09.05.2019, 15:17
DrOffset
9917 / 5374 / 1315
Регистрация: 30.01.2014
Сообщений: 8,658
09.05.2019, 15:27 25
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
0 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 77
Записей в блоге: 2
09.05.2019, 15:37  [ТС] 26
DrOffset, спасибо , доходчиво
0
DrOffset
9917 / 5374 / 1315
Регистрация: 30.01.2014
Сообщений: 8,658
09.05.2019, 16:08 27
Цитата Сообщение от alexbmd Посмотреть сообщение
константные данные
Вообще, строковые литералы, которые были приведены в вашей цитате, имеют статический класс хранения, т.к. с точки зрения С++ располагаются в статической памяти. Т.к. литерал константен - попытка его изменения приводит к неопределенном поведению. На практике, в большинстве реализаций статическая память таких констант и статическая память для других, изменяемых переменных - разная. Физически, в исполняемом файле они реализованы с помощью разных сегментов (небольшой обзор есть здесь). Нужно понимать, что автор процитированных строк описывает С++ и реализацию вместе, чтобы у читателя сложилось комплексное понимание, жертвуя при этом некоторыми тонкостями теории. Поэтому "константные данные" у него выделены отдельно.
0
alexbmd
0 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 77
Записей в блоге: 2
09.05.2019, 16:54  [ТС] 28
спасибо. интересное дополнение.
0
alexbmd
0 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 77
Записей в блоге: 2
13.05.2019, 16:50  [ТС] 29
Цитата Сообщение от zayats80888 Посмотреть сообщение
for (char* pp(p); *pp; ++pp)
DrOffset, в 3ем издание пишут это неявная инициализация. в 5ом вообще ничего не пишут просто что можно объявлять так int p(0);

кстати хотел спросить какой сокральный смысл в ++pp. ведь результат такой же как и рр++. и адрес после из выхода из фора одинаков в обоих случаях ?
0
zayats80888
1166 / 624 / 279
Регистрация: 07.02.2019
Сообщений: 1,863
13.05.2019, 17:03 30
Цитата Сообщение от alexbmd Посмотреть сообщение
какой сокральный смысл в ++pp
так быстрее, потому что:
Код
type*& operator++(type*& p)//префиксный
{ p+=sizeof(type); return p; }

type* operator++(type*& p, int)//постфиксный
{ type* ret = p; p+=sizeof(type); return ret; }
2
DrOffset
9917 / 5374 / 1315
Регистрация: 30.01.2014
Сообщений: 8,658
13.05.2019, 19:50 31
Цитата Сообщение от alexbmd Посмотреть сообщение
пишут
Ну это книга для начинающих. Обозначили, что так можно писать - этого достаточно. Вы говорили в книгах не видели, я вам дал пример книги, где это есть.

Более подробно этот вопрос освещается в книге следующего уровня: "Решение сложных задач на С++", - Г. Саттер, глава 10.
0
alexbmd
0 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 77
Записей в блоге: 2
14.05.2019, 16:32  [ТС] 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
1166 / 624 / 279
Регистрация: 07.02.2019
Сообщений: 1,863
14.05.2019, 16:40 33
Цитата Сообщение от 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
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5082 / 2550 / 703
Регистрация: 18.10.2014
Сообщений: 4,426
14.05.2019, 17:02 34
Цитата Сообщение от alexbmd Посмотреть сообщение
кстати хотел спросить какой сокральный смысл в ++pp. ведь результат такой же как и рр++. и адрес после из выхода из фора одинаков в обоих случаях ?
Результат? Именно результат как раз таки разный. В первом случае результатом будет новое значение, во втором - старое. Это побочный эффект у них одинаковый.

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

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

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

Добавлено через 8 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Результат?
резултат принта то что в {} в обоих случаях да одинаковый.
разница появляется только если во втром аргументе фора инкремент установить. for (;++x<10; )
кстати на каком именно шаге включается в работу третий аргумент ? for(;;++x) когда инкремент происходит ? в конце тела цикла ? когда дошли до } ?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Откуда вообще взялось упоминание 1
i=0;
i++; //1
0
zayats80888
1166 / 624 / 279
Регистрация: 07.02.2019
Сообщений: 1,863
14.05.2019, 17:22 36
Цитата Сообщение от alexbmd Посмотреть сообщение
простите а зачем второй аргумент int если мы передаем только один?
что бы отличать постфиксный от префиксного
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5082 / 2550 / 703
Регистрация: 18.10.2014
Сообщений: 4,426
14.05.2019, 17:30 37
Цитата Сообщение от 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
0 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 77
Записей в блоге: 2
14.05.2019, 17:34  [ТС] 38
TheCalligrapher,
я спросил Почему поинтер обнуляется ?
касательно этого поста http://www.cyberforum.ru/cpp-beginners/thread2445343/post13533650.html

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

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
что бы отличать постфиксный от префиксного
понял спасибо
0
zayats80888
1166 / 624 / 279
Регистрация: 07.02.2019
Сообщений: 1,863
14.05.2019, 17:45 39
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что за белиберда? Что здесь делает sizeof(type)???
это псевдокод, я просто показал, как это выглядело бы, если бы компилятор не знал правил арифметики указателей, и работал бы с указателями как с целочисленными типами
0
alexbmd
0 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 77
Записей в блоге: 2
14.05.2019, 17:55  [ТС] 40
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"так быстрее" не будет
почему? если префиксный инкремент две инструкции а пост инкремент три.
0
14.05.2019, 17:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2019, 17:55

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

Не обнуляется память
Добрый день. Подскажите пожалуйста. hFileMemory = CreateFileMapping(INVALID_HANDLE_VALUE,...

Обнуляется указатель
Есть класс: class person { float x, y; float s; block collision(vector&lt;block&gt;::iterator*...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru