Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/60: Рейтинг темы: голосов - 60, средняя оценка - 4.72
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701

Читаю книгу

14.08.2021, 19:12. Показов 14379. Ответов 222
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Когда пишу, то что читаю, запоминаю лучше.

Читаю книгу Курс программирования на языке СИ. Сергей Фомин, Вадим Подбельский
Есть такое предложение там:
Идентификаторы могут иметь любую длину, но компилятор учитывает не более 31 символа от начала идентификатора. В некоторых
компиляторах это ограничение еще более жесткое, и учитываются
только первые 8 символов любого идентификатора. В этом случае
идентификаторы NUMBER_OF_ROOM и NUMBER_OF_TEST
в программе будут неразличимы.
-----------------------------------------------
Непонятно что они имеют в виду под идентификатором? Возможно имена присваеваемые переменным?
Эти имена присваемые переменным не могут превышать 31 символ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2021, 19:12
Ответы с готовыми решениями:

Читаю из файла, scanf, число с лидирующим нулем
На VS 2010 #include<stdio.h> void main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); ...

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

Читаю книгу,есть то чего я не понял)
Привет,форум!) Я читаю книгу "Шилдт Г. С++ Базовый курс (3-е издание, 2010)" Свежее не нашёл,но когда я пытаюсь использовать или...

222
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
16.08.2021, 09:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от koeltrad Посмотреть сообщение
Спецификатор %р может выводить на экран и буквы и цифры. Или этот спецификатор конкретно только для указателей?
man printf
Цитата Сообщение от koeltrad Посмотреть сообщение
Как то странно если учитывать что спецификатор %p от слова Pointer и может просто напрямую взять адрес переменной &. Без использования * звёздочек.
Не может. Особенность передачи параметров в функции: передается только значение, исходный адрес не передается.
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
16.08.2021, 10:22  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не может. Особенность передачи параметров в функции: передается только значение, исходный адрес не передается.
Запустите этот код:
У меня он компилируется и выдаёт адрес переменной r
C
1
2
3
4
5
6
#include <stdio.h>
int main(void) {
    int r;
    printf("%p\n", &r);
  return 0;
}
0
фрилансер
 Аватар для Алексей1153
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,338
16.08.2021, 10:25
Цитата Сообщение от koeltrad Посмотреть сообщение
&r
ну так адрес берётся
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
16.08.2021, 10:26  [ТС]
COKPOWEHEU, пишет что не берётся. Или я неправильно понял?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,041
Записей в блоге: 1
16.08.2021, 10:33
Цитата Сообщение от koeltrad Посмотреть сообщение
COKPOWEHEU, пишет что не берётся. Или я неправильно понял?
Он пишет, что в printf уходит копия переданного значения, и, если бы внутри, printf для %p выводил бы не переданный адрес, а адрес параметра, то выводился бы адрес копии r.
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
16.08.2021, 10:51  [ТС]
Сейчас у меня мозги закипят. Я ведь так не понимаю. Переданные значения чего... Вы слова пропускаете считая это очевидным и смысла я не понимаю.

Добавлено через 5 минут
Ааа, имеете в виду что я употребил слово НАПРЯМУЮ?
А вы имеете в виду что printf берёт копию а не оригинал?))) пффф

Добавлено через 3 минуты
Я совсем про другое пишу.
Указателем называют конструкцию со звёздочкой.

А я без конструкции со звёздочкой могу взять адрес переменной.

C
1
2
3
4
5
6
#include <stdio.h>
int main(void) {
    int r;
    printf("%p\n", &r);
  return 0;
}
& - этот знак означает get a pointer что переводится как ПОЛУЧИТЬ УКАЗАТЕЛЬ
К чему я в данном коде применяю &. К переменной r. Для чего? Для получения Адреса этой переменной.
%p - этот спецификатор означает print a pointer что переводится как НАПЕЧАТАТЬ УКАЗАТЕЛЬ.
Что я печатаю с помощью %p. Я печатаю Адрес переменной r с помощью спецификатора %p

Добавлено через 1 минуту
Из данного рассуждения выходит что Указатель это адрес. Это не так, я знаю, но как быть с этой логической цепочкой?
0
фрилансер
 Аватар для Алексей1153
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,338
16.08.2021, 10:58
koeltrad, а так понятнее?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void func(const char* str, ...)
{
}
 
int main()
{
    int r=0;
    func("",r); //в функцию передаётся копия значения переменной r
    
    func("",&r); //в функцию передаётся адрес переменной r
    
    int* p=&r; //в переменную p (указатель) помещается адрес переменной r
    func("",p); //в функцию передаётся копия значения переменной p (то есть, адрес переменной r)
}
Добавлено через 53 секунды
Цитата Сообщение от koeltrad Посмотреть сообщение
Указатель это адрес
нет. Указатель - это переменная, которая может хранить адрес

Добавлено через 1 минуту
Цитата Сообщение от koeltrad Посмотреть сообщение
%p
спецификатор подсказывает функции printf, как интерпретировать значение, переданное через ..., потому что тип значения функции неизвестен
1
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
16.08.2021, 11:02  [ТС]
Так понятно. Не пойму почему разногласия возникли.

Добавлено через 3 минуты
& - этот знак означает get a pointer что переводится как ПОЛУЧИТЬ УКАЗАТЕЛЬ
К чему я в данном коде применяю &. К переменной r. Для чего? Для получения Адреса этой переменной.
0
фрилансер
 Аватар для Алексей1153
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,338
16.08.2021, 11:03
Цитата Сообщение от koeltrad Посмотреть сообщение
& - этот знак означает ПОЛУЧИТЬ УКАЗАТЕЛЬ
- да, это взятие адреса объекта (унарный оператор)
1
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
16.08.2021, 11:05  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Указатель - это переменная, которая может хранить адрес
Тогда может r будет тоже являтья указателем?
Эта переменная тоже хранит адрес.
0
фрилансер
 Аватар для Алексей1153
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,338
16.08.2021, 11:09
koeltrad, синтаксис объявления указателя:

тип* идентификатор;
тип* идентификатор=инициализирующее_значение;

а r у тебя как объявлена?
C
1
int r;
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
16.08.2021, 11:14  [ТС]
Кажется нашёл объяснение. Можете оценить?
Вот описание Указателя из интернета:
Указатель — это переменная, которая содержит адрес другой переменной.
В моём примере r содержит адрес самой себя, а не другой переменной. Поэтому r не будет являться указателем. Имеется в виду указатель на адрес другой переменной.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,041
Записей в блоге: 1
16.08.2021, 11:15
Цитата Сообщение от koeltrad Посмотреть сообщение
Не пойму почему разногласия возникли.
Если пройтись по вашим вопросам в этой теме, то кажется,
что вы хватаете по-кусочку из разных тем и нет общего понимания.

Добавлено через 1 минуту
Цитата Сообщение от koeltrad Посмотреть сообщение
В моём примере r содержит адрес самой себя, а не другой переменной. Поэтому r не будет являться указателем. Имеется в виду указатель на адрес другой переменной.
C
1
2
void * p;
p = &p;//и что ,p теперь не указатель? )
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
16.08.2021, 11:40  [ТС]
Так и есть. Я по кусочкам и учу. То что становится интересно. Так и понимание должно приходить.

Добавлено через 1 минуту
Указатель — это переменная, которая содержит адрес другой переменной.
p - содержит адрес другой переменной? Нет. Здесь или описание указателя неверно или не знаю что.

Добавлено через 21 минуту
Ну или r из моего кода тоже будет являться указателем, так как содержит адрес.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,041
Записей в блоге: 1
16.08.2021, 11:42
koeltrad, вы не на том акцент делаете.
Что такое вообще тип объекта?
Упрощенно назовем типом инструкцию компилятору как интерпретировать данные.
Соответственно, типом указателя обзовем тип, который говорит компилятору "интерпретировать содержимое как адрес".
Тогда указатель - это некая память (условно), которую нужно интерпретировать как адрес чего-то:
void * - компилятор, интерпретируй содержимое как адрес чего-то там, сам решу чего, не лезь;
int * - компилятор, интерпретируй содержимое как адрес по которому лежит целое число типа int;
float * - компилятор, интерпретируй содержимое как адрес по которому лежит число с плавающей точкой типа float.

В указатель нужно положить адрес. Чтобы взять адрес переменной имеется унарный оператор &.
&r - взять адрес переменной r.
int * p = &r; - взять адрес переменной r и сохранить его в переменной p.

Теперь в переменной p содержится адрес, удивительным образом совпадающий с адресом другой переменной - r.

void * p; - указатель на нечто
p = &p; - взять адрес переменной p и сохранить его в переменной p.
Теперь в переменной p содержится адрес, удивительным образом совпадающий с адресом самой переменной p.

void * p = (void *)0xDEADBEEF; - указатель на нечто в котором сохранили адрес со значением 0xDEADBEEF

Теперь в переменной p содержится адрес 0xDEADBEEF, который, удивительным образом, может вообще не совпадать с адресом ни одной из переменных.
1
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
16.08.2021, 11:50
Цитата Сообщение от koeltrad Посмотреть сообщение
У меня он компилируется и выдаёт адрес переменной r
Условно говоря, вы заводите переменную, которой присваиваете значение адреса вашей r, и потом значение этой переменной отправляется в функцию. Иначе говоря, адрес вы вычисляете сами, до printf доходит всего лишь число.
Цитата Сообщение от koeltrad Посмотреть сообщение
Указателем называют конструкцию со звёздочкой.
Не совсем так. Указатель это точно такая же переменная, как все остальные. Просто вместо человеко-читаемого значения там хранится номер какой-то другой ячейки. А дальше особенность Си: он позволяет за одно действие прочитать значение указателя, найти переменную по этому значению и взять значение этой переменной.
Условно говоря, у вас есть память int mem[20]; В 10-й ячейке хранится какое-то значение, например, 99. В любом месте в коде вы можете обращаться к этой "переменной" (ячейке) напрямую: mem[10] = 99; А например в ячейке 8 хранится число 10, то есть адрес "переменной". И получить доступ к значению вы можете более хитрым способом: mem[ mem[8] ] = 99. Или, что тоже самое,
C
1
2
int addr = mem[8];
mem[addr] = 99;
Таким образом для любой переменной вам известны ее адрес и значение. Но для указателя его значение это адрес другой переменной, поэтому для указателя вам известны его адрес, его значение и значение по указателю.
Цитата Сообщение от koeltrad Посмотреть сообщение
Сейчас у меня мозги закипят. Я ведь так не понимаю. Переданные значения чего
А в том-то и дело что printf не знает значения чего ему передают. Для него это просто на бор чисел. Именно поэтому нужна форматрая строка, чтобы он хотя бы понимал передали ему символ, 8-битное число, знаковое 64-битное число или указатель, по которому лежит строка.
Цитата Сообщение от koeltrad Посмотреть сообщение
& - этот знак означает get a pointer что переводится как ПОЛУЧИТЬ УКАЗАТЕЛЬ
К чему я в данном коде применяю &. К переменной r. Для чего? Для получения Адреса этой переменной.
%p - этот спецификатор означает print a pointer что переводится как НАПЕЧАТАТЬ УКАЗАТЕЛЬ.
Что я печатаю с помощью %p. Я печатаю Адрес переменной r с помощью спецификатора %p
&r правильнее назвать получением ссылки или адреса, а не указателя. Дело в том, что указатель это особый тип данных в Си, переменная. А адрес это константа. То есть вы можете объявить переменную указателя, но не можете переменную адреса.
Так вот, операцией (&r) вы получаете численное значение адреса переменной, например 0x100500. А потом это число передаете в printf. Кроме числа вы передаете его формат, чтобы функция знала, что печатать надо именно шестнадцатеричное 0x100500, а не десятичное 1049856.
Цитата Сообщение от koeltrad Посмотреть сообщение
К чему я в данном коде применяю &. К переменной r. Для чего? Для получения Адреса этой переменной.
Именно так. Взятие адреса переменной производите именно вы, а не printf.
1
Модератор
 Аватар для long399
2886 / 1848 / 933
Регистрация: 16.10.2013
Сообщений: 5,254
Записей в блоге: 15
16.08.2021, 13:21
Цитата Сообщение от koeltrad Посмотреть сообщение
cout - это похоже как вывести переменную char на экран. c(har) out
cout - console out
cin - console in
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,041
Записей в блоге: 1
16.08.2021, 13:23
long399, вообще-то, у него правильно - characters, а не console. cout и cin не имеют никакого отношения к консоли.

https://www.stroustrup.com/bs_faq2.html#cout
How do you pronounce "cout"?

"cout" is pronounced "see-out". The "c" stands for "character" because iostreams map values to and from byte (char) representations.
1
Модератор
 Аватар для long399
2886 / 1848 / 933
Регистрация: 16.10.2013
Сообщений: 5,254
Записей в блоге: 15
16.08.2021, 13:25
Croessmah, хм, всегда думал, что сокращение именно от console идет. Буду знать теперь.
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
16.08.2021, 15:03  [ТС]
Кажется понял как понятнее оформить то что мне было непонятно.
Можно так описать Указатель?:

Указатель - это переменная, ЗНАЧЕНИЕ которой содержит адрес?
В моём коде когда я не объявлял указатель, значения у r не было. Я просто объявил int r;.
C
1
2
3
4
5
6
#include <stdio.h>
int main(void) {
    int r;
    printf("%p\n", &r);
  return 0;
}
А вот адрес переменной r вызывал я функцией printf
То есть я вызывал адрес переменной r, а не её значение. Поэтому в данном случае r не является указателем.
Вот когда ЗНАЧЕНИЕ переменной содержит какой либо адрес, такая переменная называется указателем.

Надеюсь правильно. Я пытаюсь досконально во всём разобраться, не могу иначе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2021, 15:03

Читаю книгу все работал а щас выдает такую ошибку
Вот смотрите не понимаю в чем дело!? &lt;html&gt; &lt;head&gt; &lt;title&gt;Опрос&lt;/title&gt; &lt;head&gt; &lt;body&gt; &lt;h1&gt;Предварительный...

Читаю книгу Страуструпа для новичков но мне одному она кажется трудной и не совсем понятной?
на протяжении всей книги он показывает код в виде ...&lt;...&gt;... почему просто бы не объяснить?в ООП Р.Лафоре и Б.Эккеля все норм по...

Читаю книгу Криса Касперски "Искусство дизассемблирования"
Читаю книгу Криса Касперски &quot;Искусство дизассемблирования&quot;, в которой автор рассказывает, каким образом можно производить модификацию...

читаю читаю не найду
расскажите какие функции в boost::asio отвечают за то если подключился кто то то они значения возращают дайте линк а то по туториалу на...

Читаю из файла в vector
Всем доброго времени суток, пытаюсь считать файл в вектор... Но трабл, в вектор всегда пишется ноль, не могу понять где косяк... В коде...


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

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Новые блоги и статьи
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера 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 - дочь
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru