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

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

02.05.2019, 17:14. Показов 1434. Ответов 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
6352 / 3523 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru