powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по указателям
25 сообщений из 48, страница 1 из 2
Вопрос по указателям
    #38173422
asupviking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, вот программа подсчитывающая количество символов
в строке введённой пользователем, помогите разобраться с указателями,
не понимаю что происходит в двух строках

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
const int max=80;
char bufer[max];                    
char *pbufer=bufer;            //pbufer - это указатель на char, содержащий адрес первого элемента массива bufer
cin.getline(bufer, max, '\n');  

while(*pbufer)                   //пока не встретиться символ "\0"
	pbufer++;                 //вот здесь не понятно что происходит
//после каждой итерации указатель pbufer будет смещаться на один элемент массива bufer ?
//после того как цикл завершится указатель будет содержать адрес последнего элемента строки bufer ?

cout<<endl;

cout<<pbufer-bufer;           //здесь совсем не понятно, даже никаких вариантов нет

cout<<endl;
system("pause");
return 0;
}
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38173437
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asupviking, в отладчике прогонял?
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38173439
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asupviking,

Код: plaintext
1.
	pbufer++;                 //вот здесь не понятно что происходит

Что сказал используемый учебник про оператор ++?
Код: plaintext
1.
cout<<pbufer-bufer;           //здесь совсем не понятно, даже никаких вариантов нет

"Вывести в поток cout разность pbufer и bufer".
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38173452
asupviking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m_Sla, нет не прогонял, я им ещё пока не пользуюсь.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38173519
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asupvikingm_Sla, нет не прогонял, я им ещё пока не пользуюсь.ну и зря
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38173784
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asupviking


Код: plaintext
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.
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
const int max=80;
char bufer[max];                    
char *pbufer=bufer;            //pbufer - это указатель на char, содержащий адрес первого элемента массива bufer
cin.getline(bufer, max, '\n');  

while(*pbufer)                   //пока не встретиться символ "\0"
	pbufer++;                 //вот здесь не понятно что происходит
// тут увеличивается на 1 сам указатель. Смещается к следующей вперед ячейке в массиве.
//после каждой итерации указатель pbufer будет смещаться на один элемент массива bufer ?
// да
//после того как цикл завершится указатель будет содержать адрес последнего элемента строки bufer ?

// точнее следующего за последним нуль-символа.

cout<<endl;

cout<<pbufer-bufer;           //здесь совсем не понятно, даже никаких вариантов нет
// вычитание двух указателей, получение смещения первого относительно второго, в данном случае просто получится длина строки.
// надо помнить, что смещение в таком случае выставляется всегда в количестве ячеек, а не в байтах, но тут это совпадает.

cout<<endl;
system("pause");
return 0;
}
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38173792
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, это



while(*pbufer)
pbufer++;

Обычно пишется так:

while(*pbufer++);

Собственно за это мы и любим c/c++.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38174113
asupviking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction, книга говорит что оператор ++ это оператор инкремента, он увеличивает значение на единицу, а так как pbufer указатель на char он будет смещаться на sizeof(char), и указывать на следующий элемент массива.

AbstractionВывести в поток cout разность pbufer и bufer
понятно что вывести в поток, не понятно то как происходит разность между указателем на на char и массивом символов, они же не числа.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38174279
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asupvikingAbstractionВывести в поток cout разность pbufer и bufer
понятно что вывести в поток, не понятно то как происходит разность между указателем на на char и массивом символов, они же не числа.Как говорили пифагорейцы, "всё сущее есть число".

Чуть менее философски, всякая переменная примитивного типа может быть представлена числом из некоторого диапазона. В частности, любой указатель есть адрес в памяти. В Вашем случае имеем указатель на начало массива (адрес первого элемента) и указатель на первый элемент, равный '\0'. Разность указателей считается по тем же правилам, аналогичным правилам для суммы указателя и целого числа и в данном случае даёт нам количество символов в C-строке.
авторВообще, это

while(*pbufer)
pbufer++;

Обычно пишется так:

while(*pbufer++);Варианты не эквивалентны. Если изначально *pbufer == '\0', в исходном варианте значение pbufer не изменится. Скорее уж
Код: plaintext
1.
for(pbufer=bufer; *pbufer; ++pbufer);
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38174422
asupviking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction, если я правильно понимаю, это всё можно условно представить следующим образом:
например есть строка "HELLO". Адрес ячейки памяти в которой находится первый символ "H" равен 10, символ "E" - 11, символ "L" - 12, символ "L" - 13, символ "O" - 14, символ "\0" - 15.
И получается что 15-10=5 символов, только в реале адреса в шестнадцатеричной форме.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38174478
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asupvikingAbstraction, если я правильно понимаю, это всё можно условно представить следующим образом:
например есть строка "HELLO". Адрес ячейки памяти в которой находится первый символ "H" равен 10, символ "E" - 11, символ "L" - 12, символ "L" - 13, символ "O" - 14, символ "\0" - 15.
И получается что 15-10=5 символов, только в реале адреса в шестнадцатеричной форме ."Шестнадцатеричная форма" - это просто форма записи числа. "Само по себе" число не имеет никакой формы - скажем, число 18 можно писать "18", "0x12", "восемнадцать", "10010b", "1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1", ещё как угодно - это одно и то же число. Шестнадцатеричная форма удобна для понимания того, какие биты чему равны, поэтому отладчики обычно представляют значения адресов в ней.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38174524
asupviking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction , ясно, спасибо за объяснения.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38174754
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asupvikingAbstraction, книга говорит что оператор ++ это оператор инкремента, он увеличивает значение на единицу, а так как pbufer указатель на char он будет смещаться на sizeof(char), и указывать на следующий элемент массива.

AbstractionВывести в поток cout разность pbufer и bufer
понятно что вывести в поток, не понятно то как происходит разность между указателем на на char и массивом символов, они же не числа.

Эта операция производится с двумя указателями.
Первый указатель по объявленному типу, второй -- массив, но массив всегда в С и С++ без явного указания может быть приведён к типу "указатель на первый элемент этого массива", что тут и происходит.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38174759
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abstraction
while(*pbufer++);Варианты не эквивалентны. Если изначально *pbufer == '\0', в исходном варианте значение pbufer не изменится. Скорее уж
Код: plaintext
1.
for(pbufer=bufer; *pbufer; ++pbufer);

[/quot]


Да, спасибо, проглядел.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38174761
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asupvikingAbstraction, если я правильно понимаю, это всё можно условно представить следующим образом:
например есть строка "HELLO". Адрес ячейки памяти в которой находится первый символ "H" равен 10, символ "E" - 11, символ "L" - 12, символ "L" - 13, символ "O" - 14, символ "\0" - 15.
И получается что 15-10=5 символов, только в реале адреса в шестнадцатеричной форме.

В реале адреса в двоичной форме, но это не имеет никакого значения.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38174804
asupviking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, спасибо за помощь.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38177505
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОбычно пишется так:

while(*pbufer++);

Собственно за это мы и любим c/c++.

А "мы" - это кто? И почему на "нас" надо равняться? Эта конструкция выглядит высокооптимизированной, но никто не сказал, что она таковой будет выглядеть для компилятора. И никто не сказал что только с ней компилятор сможет сделать самый номральный код; мы лишь подразумеваем, что нам этого хотелось бы, и надеемся.

Реально, человеку, который учит си и находится на этапе "а что такое ++ для указателя?", я бы не советовал использовать этот ад. Он что такое pbufer++ не может понять, а вы ему рекомендуете *pbufer++.
Путь пользуется простыми иснтрукциями. Умение составлять из них цепочки придет само собой.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38177516
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

Это идиома, а не оптимизация.
Этот прием нужно знать с пеленок, иначе не сможешь читать чужие исходники, а именно в этом состоит 90% всей работы программиста.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38177578
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну замечательно, и до них дело дойдет, кто ж спорит.

однако, если взглянуть на топик со стороны, то выглядет старанно: пришел человек спросить что такое pbufer++, а ему сразу советуют *pbufer++. Пригодится, мол.

Очевидно, это нарушает порядок вещей, и поэтому такой совет он все равно проигнорирует. Постойте! Дайте же ему хотя бы текущее разгрести.
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38178251
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokНу замечательно, и до них дело дойдет, кто ж спорит.

однако, если взглянуть на топик со стороны, то выглядет старанно: пришел человек спросить что такое pbufer++, а ему сразу советуют *pbufer++. Пригодится, мол.

Очевидно, это нарушает порядок вещей, и поэтому такой совет он все равно проигнорирует. Постойте! Дайте же ему хотя бы текущее разгрести.

Я не говорил, что пригодится, и что надо пользоваться.
Я говорил, что обычно пишут так.

например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char *mystrcpy(char *dst, const char *src)
{
char *ptr;
ptr = dst;
while(*dst++=*src++);
return(ptr);
}
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38178255
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА "мы" - это кто? И почему на "нас" надо равняться?

Это не "мы", а программисты на С. (и С++). Это лаконичные языки, мощные, в которых в единице кода (строчке) можно выразить очень много. Они таковы по своей натуре, с рождения. Ну и ровняться ни на что не надо, надо просто, если хочешь писать на каком-то языке, его знать и уметь применять. Оно конечно, надо знать меру, но для С-шника подобный код хотя бы должен не вызывать затруднений в чтении.

авторЭта конструкция выглядит высокооптимизированной, но никто не сказал, что она таковой будет выглядеть для компилятора. И никто не сказал что только с ней компилятор сможет сделать самый номральный код; мы лишь подразумеваем, что нам этого хотелось бы, и надеемся.

Оптимизация тут ни при чём. Оптимизирует компилятор. А здесь просто удобство написания кода. К скорости выполнения кода это никак не относится.

авторРеально, человеку, который учит си и находится на этапе "а что такое ++ для указателя?", я бы не советовал использовать этот ад. Он что такое pbufer++ не может понять, а вы ему рекомендуете *pbufer++.
Путь пользуется простыми иснтрукциями. Умение составлять из них цепочки придет само собой.


Не хотите -- пишите на бейсике, кто ж вас заставляет...
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38178258
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНе хотите -- пишите на бейсике, кто ж вас заставляет...чёрт, +1, лучший комент за последние 2 года ))))
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38178264
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто лаконичные языки, мощные, в которых в единице кода (строчке) можно
выразить очень много.
Раз уж зашла речь: не подскажете как можно одной операцией получить частное и остаток
деления двух целых чисел?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38178275
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivЭто лаконичные языки, мощные, в которых в единице кода (строчке) можно
выразить очень много.
Раз уж зашла речь: не подскажете как можно одной операцией получить частное и остаток
деления двух целых чисел?


Как бы сложно, в С (и С++) нет возврата множественных значений, так что "одной операцией получить" не очень понятно, ГДЕ получить. На выходе функции такого быть не может, а где ещё -- только в переменных, наверное.
Ну и "одной операцией" -- тоже не понятно. Одна операция -- деление, другая -- получение остатка от деления. Видимо, имелось в виду -- одной строкой кода.

Тогда что-то в этом роде:

Код: plaintext
1.
2.
3.
4.
int a = 17, b = 4;
int res, rest;

(rest = a%b), (res = a/b);
...
Рейтинг: 0 / 0
Вопрос по указателям
    #38178281
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу и "одной операцией" -- тоже не понятно. Одна операция -- деление,
другая -- получение остатка от деления.
Для интеловского процессора это одна операция. Но таки да: он-то может вернуть результат
сразу в двух регистрах, чего в С не добиться.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по указателям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]