Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3

Как же подружиться с этими хитрыми массивами?

02.05.2019, 17:14. Показов 1592. Ответов 32

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

вопрос 1)
почему первый вариант возвращает то что я жду
C++
1
2
3
4
5
6
char pa[][8] = {"dog", "cat", "mouse"};
int i = 0;
while (*pa[i])
{
    printf("*pa[%d] = %s\n", i , pa[i++]);  //printf("*pa[%d] = %c\n", i , pa[i++][2]);
}
а если заменить 8 на pa[][7] то получаю одну лишную строку
Assembler
1
2
3
4
*pa[1] = dog                                                                                                                 
*pa[2] = cat                                                                                                                 
*pa[3] = mouse                                                                                                               
*pa[4] = 
вопрос 2)
есть какоето правило , как без пробы записи (получения ошибки от компилятора) , понять что массив (ну или переменная) будет read-only?
например
C++
1
char * list = "very long string";  //массив символов READ-ONLY
а тут доступный для записи
C++
1
char list[] = "very long string";  //массив символов R/W

вопрос 3)
почему в двумерный массив я могу записать отдельный символ в нужную позицию
C++
1
pa[i][1]= 'A';
а в массив ссылок char *pa[] уже не могу, как туда записать его ?

вопрос 4)
как в конец каждой строки массива дописать порядковый номер взятый из цикла ?
C++
1
2
3
4
5
6
7
char pa[][8] = {"cat", "dogggie", "mouse"};
int i = 0;
while (*pa[i])
{
    pa[i]+= (char)i;  //даёт ошибку
    ....
}
чтоб получилось cat0, dogggie1 и тд ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2019, 17:14
Ответы с готовыми решениями:

В чем разница между этими массивами?
const char *names = {"Ivanov", "Petrov", "Sidorov"}; const char **names = {"Ivanov", "Petrov", "Sidorov"}; Добавлено через 8...

Как подружиться с STM32
Добрый день! Я хочу научиться работать/писать код для STM32 Динный момент имею Dyscovery board с STM32F051R8 и еще там arm стоит сейчас...

Как подружиться с session_start()
Есть модуль фотогалереи, требуется сделать его под себя, а именно поменять интерфейсную часть. Имеется css, осталось правильно все...

32
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
10.05.2019, 16:00  [ТС]
Студворк — интернет-сервис помощи студентам
понял спасибо.
думал тоже можно типо как тут
int arr[] = { 3, 5, 6, 7, 9 };
int *p;
p[0] = arr[1];
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
10.05.2019, 16:11
alexbmd, нельзя. int *p содержит мусор в адресе, так что p[0] укажет на невыделенную область памяти. Можно так:

C++
1
2
3
4
int arr[] = { 3, 5, 6, 7, 9 };
int *p = new int;
*p = arr[1];
delete p;
Добавлено через 2 минуты
Или так:

C++
1
2
int arr[] = { 3, 5, 6, 7, 9 };
int *p = arr+1;
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
10.05.2019, 16:13
Цитата Сообщение от alexbmd Посмотреть сообщение
почемуто просветление не наступает а еще более и более увязываю в этом болоте..
Потому что пытаетесь выстроить фундаментальные знания на одних лишь экспериментах.
Компилятор в этом деле слабый помощник, т.к. большая часть некорректных случаев просто не диагностируется. Такова специфика С\С++: расчет идет на то, что программист грамотный и знает что делает. Язык старается избегать диагностики вообще, если она ведет к дополнительным накладным расходам во время исполнения. И тут вы попадаете в ловушку, т.к. ждете, что компилятор укажет вам на все ошибки, а раз код собрался - значит он правильный. А вот и нет.

Вам нужно взять хорошую книгу, а точнее не менее трех книг, и вдумчиво их прочитать, попутно экспериментируя.
При обучении только на форумах, толкового специалиста из вас не получится.
Как минимум книга Липпмана, я ее вам рекомендовал в другой теме.
Затем, книги Саттера и книги Мейерса.
Если вы не будете читать книги, то ваши знания так и останутся обрывочными.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
10.05.2019, 16:25
Цитата Сообщение от DrOffset Посмотреть сообщение
Язык старается избегать диагностики вообще, если она ведет к дополнительным накладным расходам во время исполнения.
у меня еще складывается впечатление, что сложность языка обусловлена тем, что бы упростить код компилятора и соответственно время компиляции, постигая тонкости я раньше не брал в расчет эту обратную сторону и это очень мешало придти к логической гармонии в мозге. но возможно я опять ошибаюсь?

Добавлено через 4 минуты
или правильней сказать не сложность языка, а сложность языковых конструкций.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.05.2019, 16:39
Цитата Сообщение от alexbmd Посмотреть сообщение
C++
1
p[0] = arr[1];
Это UB.
Так делать нельзя. Я же написал массив != указатель, обратное утверждение тоже равносильно.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
10.05.2019, 16:53  [ТС]
Липмана я читаю. спасибо за наводку!

ааа неопределеное поведение а то я не понимал что это такое

Цитата Сообщение от Azazel-San Посмотреть сообщение
Я же написал массив != указатель, обратное утверждение тоже равносильно.
вот читая книжки , они нас наталкивают на то что это разное но почти одно тоже. есть адрес и у одного и у другого. есть значение. могу обращяться к ссылке как p[0] и к массиву как p+1
C++
1
2
3
4
int arr[] = { 3, 5, 6, 7, 9 };
int *p;
p[0] = arr[1];
printf("%p",p[0]);
вот даже варнингов нету.
я понимаю что массив не равно ссылке но это сущности почти одного и тоже.
я могу значение присвоить и туда и туда. я могу адресс прочитать и там и там.
для инициализации массива в куче используются ссылки и тд.
почему это UB ?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.05.2019, 17:08
Цитата Сообщение от alexbmd Посмотреть сообщение
почему это UB ?
Указатель не инициализирован.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
10.05.2019, 17:12
Цитата Сообщение от alexbmd Посмотреть сообщение
я понимаю что массив не равно ссылке но это сущности почти одного и тоже.
я могу значение присвоить и туда и туда. я могу адресс прочитать и там и там.
для инициализации массива в куче используются ссылки и тд.
в ЭВМ все сущности это адреса. в С++ пока из любой структуры данных можно кишки (адреса) достать средствами которыми ты сейчас играешь.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
10.05.2019, 17:14  [ТС]
а так нормально ?
int *p = 0;
p[0] = arr[1];
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
10.05.2019, 17:16
Цитата Сообщение от alexbmd Посмотреть сообщение
я могу значение присвоить и туда и туда. я могу адрес прочитать и там и там.
Значение можно присвоить/прочитать только тогда, когда адрес, содержащийся в указателе, указывает на ВЫДЕЛЕННУЮ программе память. То есть на статически/динамически/ещё как-то выделенную переменную или массив. Если адрес указывает "куда нибудь", то операционная система, заметив что твоя программа читает или пишет не там где ей разрешено, принудительно завершит выполнение программы. Причём это будет происходить не всегда.

Добавлено через 36 секунд
Цитата Сообщение от alexbmd Посмотреть сообщение
а так нормально ?
Нет. Потому что адрес с значением 0 не выделялся твоей программе.
1
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.05.2019, 17:16
Цитата Сообщение от _stanislav Посмотреть сообщение
в С++ пока из любой структуры данных можно кишки (адреса) достать средствами которыми ты сейчас играешь.
адреса битовых полей не достать, вроде как
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
10.05.2019, 17:17
Правильно будет

C++
1
2
3
4
int arr[] = { 3, 5, 6, 7, 9 };
int arr2[] = {0, 0, 0, 0, 0};
int *p = arr2;
p[0] = arr[1];
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
10.05.2019, 18:21  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Причём это будет происходить не всегда.
позновательно спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2019, 18:21

Обработка строк с хитрыми ограничениями и условиями
Здравствуйте! Столкнулся с трудным заданием для начинающего на языке C. Хитрости выделены жирным. Из-за них не могу найти решение,...

Задачу не могу сделать идеально с двумя условиями хитрыми
есть задача от Яндекса для решения задачи я бы написал 2 разных запроса элементарных! но тут скорее всего надо написать...

Не могу подружиться с inline-block !
Доброго времени! есть во такая прелесть... и проблема - вложенный контейнер "situation" не хочет вставать после контейнера...

Так и не удалось подружиться с TIMER0
В Протеусе решил помигать светодиодом с частотой 1 сек на ATmega16 (частота процессора 8000000Гц). Как бы все понятно, но результат не...

Помогите подружиться с Клавой .... или прога опроса клавы
В процедуре опроса клавы херь какая-то …помехи исключил путем низкой частоты опроса.... точно установил путь куда идет прога в железе и не...


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

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

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru