Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Князь Трех Море
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 21
09.05.2013, 17:23     В С++ может ли argv быть двухмерным массивом? #1
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 с двумя аргументами?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.05.2013, 17:45     В С++ может ли argv быть двухмерным массивом? #2
ображение к символу
Князь Трех Море
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 21
09.05.2013, 18:00  [ТС]     В С++ может ли argv быть двухмерным массивом? #3
Jupiter, но почему там два значения, а не одно?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.05.2013, 18:04     В С++ может ли argv быть двухмерным массивом? #4
argv[1] - обращаемся к первому аргументу командной строки <-- это строка
argv[1][0] - обращаемся к первому символу первого аргумента командной строки <-- это символ - char
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,695
Записей в блоге: 3
09.05.2013, 18:53     В С++ может ли argv быть двухмерным массивом? #5
Князь Трех Море, дело не в аргументе функции 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;   
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.05.2013, 19:58     В С++ может ли argv быть двухмерным массивом? #6
Цитата Сообщение от IGPIGP Посмотреть сообщение
Этот тип унаследован от C и здорово отличается от других примитивных типов языка. Это указатель на массив "знающий" свой размер, за что его иногда называют, как-то вроде, "почти контейнер". Определить размер можно по завершающему нуль-символу
Ну это вы, конечно, через край хватанули)) Ничего в этом типе особенного нет, просто среди элементов, которые может содержать такой массив, выделяется один, который является неким зарезервированным ограничителем. Точно так же в массиве натуральных чисел (целых положительных, больших нуля) ограничителем может быть нулевой элемент. В массиве даблов таким элементом может быть какой-нибудь INF или NAN. Кстати, функция strtok отлично демонстрирует, что ничего особенного в нуль-терминаторе нет, она использует его как свой служебный символ, служащий разделителем токенов.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,695
Записей в блоге: 3
13.05.2013, 20:20     В С++ может ли argv быть двухмерным массивом? #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Ну это вы, конечно, через край хватанули))
Не уверен. Хватанул конечно, - со мной бывает. Но думаю не сейчас. Указатель на char как и любой указатель не является законченным типом, пока не инициализирован. Но даже и в этом он отличается от других указателей. Его нуль-символ поддерживается почти, всеми библиотечными функциями, принимающими тип char. Другими словами, этот указатель имеет для них иной смысл. А это значит, что и будучи инициализированным он представляет качественно, иной тип. Распечатав указатель на int мы увидим стандартный поток вывода выдаст на консоль что-то вроде E2E4 (шах!)), то есть значение 4-байтового адреса. С указателем на char, - другая история. Но тип, в числе прочего определяется допустимыми операциями и это значит, что раз указатель на char интерпретируется иначе чем другие, то и тип это другой?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 20:29     В С++ может ли argv быть двухмерным массивом? #8
Цитата Сообщение от IGPIGP Посмотреть сообщение
С указателем на char, - другая история.
но это не заслуга char*,а заслуга функций, в которых сделали такое поведение для данного типа.
Таким же образом можно не добавлять ноль в конец. А можно написать аналоги для int*,но это же не сделает int* супер-типом
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.05.2013, 20:30     В С++ может ли argv быть двухмерным массивом? #9
Цитата Сообщение от IGPIGP Посмотреть сообщение
Указатель на char как и любой указатель не является законченным типом, пока не инициализирован
Почему это вдруг? Указатель - вполне себе законченный тип. Пока переменная-указатель не инициализирована, она просто содержит мусор, как и любая другая переменная языка С/С++.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Другими словами, этот указатель имеет для них иной смысл.
В этом и ошибка - не указатель имеет для них особый смысл, а нуль-терминатор.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Распечатав указатель на int мы увидим стандартный поток вывода выдаст на консоль что-то вроде E2E4 (шах!)), то есть значение 4-байтового адреса. С указателем на char, - другая история.
Речь, полагаю, о стандартном выводе в С++? std::cout?
Цитата Сообщение от IGPIGP Посмотреть сообщение
С указателем на char, - другая история.
Никакой другой истории, обычная перегрузка.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но тип, в числе прочего определяется допустимыми операциями и это значит, что раз указатель на char интерпретируется иначе чем другие, то и тип это другой?
Интерпретация и допустимые операции - совсем разные вещи. Для указателя на char допустимые операции точно такие же, как для любого другого указателя.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
13.05.2013, 20:40     В С++ может ли argv быть двухмерным массивом? #10
Немного проясню для тех, кто похоже чего-то не понимает
Нуль-терминатор это всего лишь условность. Разработчики языка С решили, что строки будут заканчиваться на 0, с таким же успехом они могли решить использовать для этого любой другой символ. В ассемблере (точнее в DOS), например, в качестве этого символа используется '$'.
Т.е. на С мы имеем
C++
1
"Hello, World!", 0;
а на ассемблере под DOS
Assembler
1
"Hello, World!", '$'
Никакого скрытого магического смысла завершающий символ не несет, и уж тем более не меняет свойства указателя, указывающего на строку его (завершающий символ) содержащую.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,695
Записей в блоге: 3
13.05.2013, 20:58     В С++ может ли argv быть двухмерным массивом? #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Интерпретация и допустимые операции - совсем разные вещи. Для указателя на char допустимые операции точно такие же, как для любого другого указателя.
Хорошо, пусть библиотеки, - не встроенные в язык средства. Но какой ещё указатель можно инициализировать, полагаясь на автоматическое завершение каким-то специальным образом:
char* a = "abcde";
Эта возможность называется операцией инициализации и встроена в язык.
Что касается таких библиотек как, стандартный поток вывода, то это тоже совсем не мало.
Указатель на char можно использовать и как указатель на символ, но можно и как указатель на С-строку. У компилятора нет средств определить, что имеется в виду не попробовав. Но в вопросе темы, - вопрос о 2-мерном массиве и важно было объяснить, что массив указателей на char, в данном случае массив массивов, то есть 2-х мерный. От таких же массивов других примитивных типов (int[] например), его размерность в строках может не совпадать, что является признаком схожим с контейнерами.
Я не стану спорить с тем, что указатель на char имеет много общего с указателями на другие типы, но отличия от них у него, достаточно существенны.

Добавлено через 3 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
Никакого скрытого магического смысла завершающий символ не несет, и уж тем более не меняет свойства указателя, указывающего на строку его (завершающий символ) содержащую.
Да хоть, чем бы ни завершался. Скрытым он является при интерпретации и инициализации. А желание понять, оно или есть или его нет. Обращайтесь в первом лице, в обморок не упаду.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:00     В С++ может ли argv быть двухмерным массивом? #12
Цитата Сообщение от IGPIGP Посмотреть сообщение
Эта возможность называется операцией инициализации и встроена в язык
Угу. Указатель инициализируется указателем - все стандартно, как и для всех типов

И виноват в этом не указатель на char, а то что создается строковый литерал(или используется уже созданный) и его адресом инициализируется указатель.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.05.2013, 21:03     В С++ может ли argv быть двухмерным массивом? #13
Цитата Сообщение от IGPIGP Посмотреть сообщение
char* a = "abcde";
Это несколько иное. Тут в язык встроена возможность создания компилятором строкового литерала, который интерпретируется как константный указатель на char (кстати, побуду занудой, и скажу, что данный код не соответствует стандарту - указатель на коснтанту присваивается указателю на не-константу ). А сам char * здесь просто выступает котейнером, хранителем адреса константного литерала. Так что, опять же, в самом указателе нет ничего сверхъестественного.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
13.05.2013, 21:03     В С++ может ли argv быть двухмерным массивом? #14
Цитата Сообщение от IGPIGP Посмотреть сообщение
char* a = "abcde";
Эта возможность называется операцией инициализации и встроена в язык.
суть в том, что когда компилятор видит что-то в двойных ковычках, он дописывает 0 в конце, а не в том, что инициализируется char*.

update: блин страницу не обновил)
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,695
Записей в блоге: 3
13.05.2013, 21:07     В С++ может ли argv быть двухмерным массивом? #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Указатель инициализируется указателем - все стандартно, как и для всех типов
Указатель получает значение указателя, а инициализируется память. И память тут инициализируется скрывая присоединение символа завершения.

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
суть в том, что когда компилятор видит что-то в двойных ковычках
Собственно, всё можно свести к поведению компилятора.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
13.05.2013, 21:08     В С++ может ли argv быть двухмерным массивом? #16
Цитата Сообщение от IGPIGP Посмотреть сообщение
Указатель получает значение указателя, а инициализируется память.
C++
1
const char *str = "asdf";
указатель str инициализируется "указателем" "asdf", потому что "asfd" после компиляции станет указателем. Вот это
C++
1
char ch = "asdf"[0];
вполне валидная операция, по причине, описанной выше.

Называть "asfd" указателем конечно неправильно, поэтому этот термин употреблен в кавычках.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:09     В С++ может ли argv быть двухмерным массивом? #17
Цитата Сообщение от IGPIGP Посмотреть сообщение
И память тут инициализируется скрывая присоединение символа завершения.
тогда еще и "равно" скрывает это:
C++
1
char * super_pointer("my string");
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,695
Записей в блоге: 3
13.05.2013, 21:19     В С++ может ли argv быть двухмерным массивом? #18
Цитата Сообщение от silent_1991 Посмотреть сообщение
Тут в язык встроена возможность создания компилятором строкового литерала, который интерпретируется как константный указатель на char
Ключевая фраза, - "в язык встроена возможность" - признак типа. Побуду занудой и констатирую, что для
const *char я Вас убедил. Но не констант, что другой тип? Мой компилятор позволяет инициализировать:
char* a ="abcd";
и потом:
a[0]='w';
то есть, такое ощущение, что это аналогично созданию массива:
char a[] = {'a', 'b', 'c', 'd', '\0'};


Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
тогда еще и "равно" скрывает это:
нет, именно инициализация. Ваш пример инициализации "равно", кстати не содержит, зачем же о нём говорить?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
13.05.2013, 21:31     В С++ может ли argv быть двухмерным массивом? #19
IGPIGP, ну так "abcd" - это же и есть массив - char const [5].
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 21:42     В С++ может ли argv быть двухмерным массивом?
Еще ссылки по теме:

C++ Может ли быть такое?
C++ Ошибка с двухмерным массивом
C++ Работа с двухмерным динамеческим массивом через указатель

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:42     В С++ может ли argv быть двухмерным массивом? #20
Цитата Сообщение от IGPIGP Посмотреть сообщение
то есть, такое ощущение, что это аналогично созданию массива:
То что Вы делаете, это UB - вы пишите в строковый литерал
Переменную типа int тоже можно рассмотреть как массив из sizeof(int) элементов типа char. И адрес этой int переменной будет адресом начала массива
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ваш пример инициализации "равно", кстати не содержит, зачем же о нём говорить?
Затем, что значение указателя инициализируется указателем
Yandex
Объявления
13.05.2013, 21:42     В С++ может ли argv быть двухмерным массивом?
Ответ Создать тему
Опции темы

Текущее время: 02:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru