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

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

02.05.2019, 17:14. Показов 1648. Ответов 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
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
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
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,004
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
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru