Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 21

В С++ может ли argv быть двухмерным массивом?

09.05.2013, 17:23. Показов 3625. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
int main(int argc, char *argv[]) {
    argv[1][0] = tolower(argv[1][0]);
    argv[1][1] = tolower(argv[1][1]);
Вот что это означает?
Когда у argv с двумя аргументами?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.05.2013, 17:23
Ответы с готовыми решениями:

Почему ссылка на Object может быть проинициализирована массивом любого типа?
Пример Object myobj = new float;

Проект с двухмерным массивом
Помогите решить задачку. Создать проект заполнения массива А(9,9) 0 и 1 в шахматном порядке. Вывести массив на форму в виде таблицы.

Проблемы с двухмерным массивом
Var summ,promsumm,bufa:real; a: array of real ; i,j,i1,j1,m,n,promi:integer; begin writeln('Введите количество строк массива...

40
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
09.05.2013, 17:45
ображение к символу
0
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 21
09.05.2013, 18:00  [ТС]
Jupiter, но почему там два значения, а не одно?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
09.05.2013, 18:04
argv[1] - обращаемся к первому аргументу командной строки <-- это строка
argv[1][0] - обращаемся к первому символу первого аргумента командной строки <-- это символ - char
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.05.2013, 18:53
Князь Трех Море, дело не в аргументе функции Main, а в типе char *. Этот тип унаследован от C и здорово отличается от других примитивных типов языка. Это указатель на массив "знающий" свой размер, за что его иногда называют, как-то вроде, "почти контейнер". Определить размер можно по завершающему нуль-символу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int main(){
char *a/* <- это уже массив символов с завершающим '\0' (C-строка) */=
"Mama mila ramu";//завершающий 0 в самом литерале не присутствует, но добавится автоматически при инициализации
//указывая, что данная строка - единое целое, как значение на которое указывает a
cout<<a<<endl;
char *b /* скобки [] показывают что это массив C-строк указанных слева -> */ []=
{"Hare","Rama","Hare","Crishna"};//при инициализации завершающие нули появятся у каждой C-строки на которую
//будут указывать b[0]...b[3]
for(int i=0; i<4; ++i)cout<<b[i]<<" ";
cout<<endl;
system("pause");
return 0;   
}
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.05.2013, 19:58
Цитата Сообщение от IGPIGP Посмотреть сообщение
Этот тип унаследован от C и здорово отличается от других примитивных типов языка. Это указатель на массив "знающий" свой размер, за что его иногда называют, как-то вроде, "почти контейнер". Определить размер можно по завершающему нуль-символу
Ну это вы, конечно, через край хватанули)) Ничего в этом типе особенного нет, просто среди элементов, которые может содержать такой массив, выделяется один, который является неким зарезервированным ограничителем. Точно так же в массиве натуральных чисел (целых положительных, больших нуля) ограничителем может быть нулевой элемент. В массиве даблов таким элементом может быть какой-нибудь INF или NAN. Кстати, функция strtok отлично демонстрирует, что ничего особенного в нуль-терминаторе нет, она использует его как свой служебный символ, служащий разделителем токенов.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.05.2013, 20:20
Цитата Сообщение от silent_1991 Посмотреть сообщение
Ну это вы, конечно, через край хватанули))
Не уверен. Хватанул конечно, - со мной бывает. Но думаю не сейчас. Указатель на char как и любой указатель не является законченным типом, пока не инициализирован. Но даже и в этом он отличается от других указателей. Его нуль-символ поддерживается почти, всеми библиотечными функциями, принимающими тип char. Другими словами, этот указатель имеет для них иной смысл. А это значит, что и будучи инициализированным он представляет качественно, иной тип. Распечатав указатель на int мы увидим стандартный поток вывода выдаст на консоль что-то вроде E2E4 (шах!)), то есть значение 4-байтового адреса. С указателем на char, - другая история. Но тип, в числе прочего определяется допустимыми операциями и это значит, что раз указатель на char интерпретируется иначе чем другие, то и тип это другой?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.05.2013, 20:29
Цитата Сообщение от IGPIGP Посмотреть сообщение
С указателем на char, - другая история.
но это не заслуга char*,а заслуга функций, в которых сделали такое поведение для данного типа.
Таким же образом можно не добавлять ноль в конец. А можно написать аналоги для int*,но это же не сделает int* супер-типом
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.05.2013, 20:30
Цитата Сообщение от IGPIGP Посмотреть сообщение
Указатель на char как и любой указатель не является законченным типом, пока не инициализирован
Почему это вдруг? Указатель - вполне себе законченный тип. Пока переменная-указатель не инициализирована, она просто содержит мусор, как и любая другая переменная языка С/С++.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Другими словами, этот указатель имеет для них иной смысл.
В этом и ошибка - не указатель имеет для них особый смысл, а нуль-терминатор.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Распечатав указатель на int мы увидим стандартный поток вывода выдаст на консоль что-то вроде E2E4 (шах!)), то есть значение 4-байтового адреса. С указателем на char, - другая история.
Речь, полагаю, о стандартном выводе в С++? std::cout?
Цитата Сообщение от IGPIGP Посмотреть сообщение
С указателем на char, - другая история.
Никакой другой истории, обычная перегрузка.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но тип, в числе прочего определяется допустимыми операциями и это значит, что раз указатель на char интерпретируется иначе чем другие, то и тип это другой?
Интерпретация и допустимые операции - совсем разные вещи. Для указателя на char допустимые операции точно такие же, как для любого другого указателя.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
13.05.2013, 20:40
Немного проясню для тех, кто похоже чего-то не понимает
Нуль-терминатор это всего лишь условность. Разработчики языка С решили, что строки будут заканчиваться на 0, с таким же успехом они могли решить использовать для этого любой другой символ. В ассемблере (точнее в DOS), например, в качестве этого символа используется '$'.
Т.е. на С мы имеем
C++
1
"Hello, World!", 0;
а на ассемблере под DOS
Assembler
1
"Hello, World!", '$'
Никакого скрытого магического смысла завершающий символ не несет, и уж тем более не меняет свойства указателя, указывающего на строку его (завершающий символ) содержащую.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.05.2013, 20:58
Цитата Сообщение от silent_1991 Посмотреть сообщение
Интерпретация и допустимые операции - совсем разные вещи. Для указателя на char допустимые операции точно такие же, как для любого другого указателя.
Хорошо, пусть библиотеки, - не встроенные в язык средства. Но какой ещё указатель можно инициализировать, полагаясь на автоматическое завершение каким-то специальным образом:
char* a = "abcde";
Эта возможность называется операцией инициализации и встроена в язык.
Что касается таких библиотек как, стандартный поток вывода, то это тоже совсем не мало.
Указатель на char можно использовать и как указатель на символ, но можно и как указатель на С-строку. У компилятора нет средств определить, что имеется в виду не попробовав. Но в вопросе темы, - вопрос о 2-мерном массиве и важно было объяснить, что массив указателей на char, в данном случае массив массивов, то есть 2-х мерный. От таких же массивов других примитивных типов (int[] например), его размерность в строках может не совпадать, что является признаком схожим с контейнерами.
Я не стану спорить с тем, что указатель на char имеет много общего с указателями на другие типы, но отличия от них у него, достаточно существенны.

Добавлено через 3 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
Никакого скрытого магического смысла завершающий символ не несет, и уж тем более не меняет свойства указателя, указывающего на строку его (завершающий символ) содержащую.
Да хоть, чем бы ни завершался. Скрытым он является при интерпретации и инициализации. А желание понять, оно или есть или его нет. Обращайтесь в первом лице, в обморок не упаду.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.05.2013, 21:00
Цитата Сообщение от IGPIGP Посмотреть сообщение
Эта возможность называется операцией инициализации и встроена в язык
Угу. Указатель инициализируется указателем - все стандартно, как и для всех типов

И виноват в этом не указатель на char, а то что создается строковый литерал(или используется уже созданный) и его адресом инициализируется указатель.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.05.2013, 21:03
Цитата Сообщение от IGPIGP Посмотреть сообщение
char* a = "abcde";
Это несколько иное. Тут в язык встроена возможность создания компилятором строкового литерала, который интерпретируется как константный указатель на char (кстати, побуду занудой, и скажу, что данный код не соответствует стандарту - указатель на коснтанту присваивается указателю на не-константу ). А сам char * здесь просто выступает котейнером, хранителем адреса константного литерала. Так что, опять же, в самом указателе нет ничего сверхъестественного.
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
13.05.2013, 21:03
Цитата Сообщение от IGPIGP Посмотреть сообщение
char* a = "abcde";
Эта возможность называется операцией инициализации и встроена в язык.
суть в том, что когда компилятор видит что-то в двойных ковычках, он дописывает 0 в конце, а не в том, что инициализируется char*.

update: блин страницу не обновил)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.05.2013, 21:07
Цитата Сообщение от Croessmah Посмотреть сообщение
Указатель инициализируется указателем - все стандартно, как и для всех типов
Указатель получает значение указателя, а инициализируется память. И память тут инициализируется скрывая присоединение символа завершения.

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
суть в том, что когда компилятор видит что-то в двойных ковычках
Собственно, всё можно свести к поведению компилятора.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
13.05.2013, 21:08
Цитата Сообщение от IGPIGP Посмотреть сообщение
Указатель получает значение указателя, а инициализируется память.
C++
1
const char *str = "asdf";
указатель str инициализируется "указателем" "asdf", потому что "asfd" после компиляции станет указателем. Вот это
C++
1
char ch = "asdf"[0];
вполне валидная операция, по причине, описанной выше.

Называть "asfd" указателем конечно неправильно, поэтому этот термин употреблен в кавычках.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.05.2013, 21:09
Цитата Сообщение от IGPIGP Посмотреть сообщение
И память тут инициализируется скрывая присоединение символа завершения.
тогда еще и "равно" скрывает это:
C++
1
char * super_pointer("my string");
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.05.2013, 21:19
Цитата Сообщение от silent_1991 Посмотреть сообщение
Тут в язык встроена возможность создания компилятором строкового литерала, который интерпретируется как константный указатель на char
Ключевая фраза, - "в язык встроена возможность" - признак типа. Побуду занудой и констатирую, что для
const *char я Вас убедил. Но не констант, что другой тип? Мой компилятор позволяет инициализировать:
char* a ="abcd";
и потом:
a[0]='w';
то есть, такое ощущение, что это аналогично созданию массива:
char a[] = {'a', 'b', 'c', 'd', '\0'};


Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
тогда еще и "равно" скрывает это:
нет, именно инициализация. Ваш пример инициализации "равно", кстати не содержит, зачем же о нём говорить?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
13.05.2013, 21:31
IGPIGP, ну так "abcd" - это же и есть массив - char const [5].
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.05.2013, 21:42
Цитата Сообщение от IGPIGP Посмотреть сообщение
то есть, такое ощущение, что это аналогично созданию массива:
То что Вы делаете, это UB - вы пишите в строковый литерал
Переменную типа int тоже можно рассмотреть как массив из sizeof(int) элементов типа char. И адрес этой int переменной будет адресом начала массива
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ваш пример инициализации "равно", кстати не содержит, зачем же о нём говорить?
Затем, что значение указателя инициализируется указателем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2013, 21:42
Помогаю со студенческими работами здесь

Работа с двухмерным массивом
Здравствуйте не получается наладит программу всё время выдёт ошибкуunit Unit1; interface uses Windows, Messages, SysUtils,...

Работа с двухмерным массивом данных
Голова просто горит. Нужна ваша помощь!!! Также,во второй части необходимо создать блок-схему. КТО ПОМОЖЕТ - СТАВЛЮ НИК В РАМКУ ПЕРЕД...

действия над двухмерным массивом
Дан двухмерный массив. Найти наибольший и наименьший элементы массива и, чередуя, заполнить ими одномерный массив заданной размерности....

Работа с двухмерным массивом данных
Всем привет. Нужна ваша помощь! Имеется такой код, на который нужно сделать отдельные кнопки, которые : &quot; Упорядочить заданную...

Различные действия с двухмерным массивом
HighPredator, Помогите,пожалуйста,очень надо. Ничего не получается... Дан двумерный массив размером M*N. Найти количество отрицательных...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru