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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Князь Трех Море
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 21
#1

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

09.05.2013, 17:23. Просмотров 1318. Ответов 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 с двумя аргументами?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2013, 17:23     В С++ может ли argv быть двухмерным массивом?
Посмотрите здесь:

Управление двухмерным массивом из функции - C++
Доброго времени суток, пожалуйста, подскажите, как правильно передать в функцию указатель на двухмерный массив, а затем из функции изменять...

Работа с двухмерным динамеческим массивом через указатель - C++
Натупил здесь наверное сильно, подскажите ребят, а то долго уже сиджу над этим... Где ошибки? Программу компилирует, но потом выбивает. ...

Может ли быть такое? - C++
поставил счетчик для сравнений в пирамидальной сортировке массива выдает 34732 сравнения. Добавлено через 1 час 3 минуты up!

Память не может быть прочитана! - C++
Проблема возникает при копировании одного массива в другой. Я вроди просмотрел и размерности вроди совпадают, но может быть я что то...

где может быть ошибка на с++ - C++
при подсчете sn через 5 членов цикл повторяется вот текст программы #include <iostream> #include <iomanip> #include <math.h> ...

Как такое может быть? - C++
Пишу программку... Начало функции мейн. Не прошло еще ничего кроме файла: int k=1; int l=1; На что компилятор мне выдает, что...

В чём может быть ошибка? - C++
Пишет, что нету точки с запятой. Где??? #include <iostream> #include <string> using namespace std; { class Program ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.05.2013, 18:04     В С++ может ли argv быть двухмерным массивом? #4
argv[1] - обращаемся к первому аргументу командной строки <-- это строка
argv[1][0] - обращаемся к первому символу первого аргумента командной строки <-- это символ - char
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,490
Записей в блоге: 4
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
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
13.05.2013, 19:58     В С++ может ли argv быть двухмерным массивом? #6
Цитата Сообщение от IGPIGP Посмотреть сообщение
Этот тип унаследован от C и здорово отличается от других примитивных типов языка. Это указатель на массив "знающий" свой размер, за что его иногда называют, как-то вроде, "почти контейнер". Определить размер можно по завершающему нуль-символу
Ну это вы, конечно, через край хватанули)) Ничего в этом типе особенного нет, просто среди элементов, которые может содержать такой массив, выделяется один, который является неким зарезервированным ограничителем. Точно так же в массиве натуральных чисел (целых положительных, больших нуля) ограничителем может быть нулевой элемент. В массиве даблов таким элементом может быть какой-нибудь INF или NAN. Кстати, функция strtok отлично демонстрирует, что ничего особенного в нуль-терминаторе нет, она использует его как свой служебный символ, служащий разделителем токенов.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,490
Записей в блоге: 4
13.05.2013, 20:20     В С++ может ли argv быть двухмерным массивом? #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Ну это вы, конечно, через край хватанули))
Не уверен. Хватанул конечно, - со мной бывает. Но думаю не сейчас. Указатель на char как и любой указатель не является законченным типом, пока не инициализирован. Но даже и в этом он отличается от других указателей. Его нуль-символ поддерживается почти, всеми библиотечными функциями, принимающими тип char. Другими словами, этот указатель имеет для них иной смысл. А это значит, что и будучи инициализированным он представляет качественно, иной тип. Распечатав указатель на int мы увидим стандартный поток вывода выдаст на консоль что-то вроде E2E4 (шах!)), то есть значение 4-байтового адреса. С указателем на char, - другая история. Но тип, в числе прочего определяется допустимыми операциями и это значит, что раз указатель на char интерпретируется иначе чем другие, то и тип это другой?
Croessmah
Модератор
Эксперт CЭксперт С++
13053 / 7316 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
13.05.2013, 20:29     В С++ может ли argv быть двухмерным массивом? #8
Цитата Сообщение от IGPIGP Посмотреть сообщение
С указателем на char, - другая история.
но это не заслуга char*,а заслуга функций, в которых сделали такое поведение для данного типа.
Таким же образом можно не добавлять ноль в конец. А можно написать аналоги для int*,но это же не сделает int* супер-типом
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
13.05.2013, 20:30     В С++ может ли argv быть двухмерным массивом? #9
Цитата Сообщение от IGPIGP Посмотреть сообщение
Указатель на char как и любой указатель не является законченным типом, пока не инициализирован
Почему это вдруг? Указатель - вполне себе законченный тип. Пока переменная-указатель не инициализирована, она просто содержит мусор, как и любая другая переменная языка С/С++.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Другими словами, этот указатель имеет для них иной смысл.
В этом и ошибка - не указатель имеет для них особый смысл, а нуль-терминатор.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Распечатав указатель на int мы увидим стандартный поток вывода выдаст на консоль что-то вроде E2E4 (шах!)), то есть значение 4-байтового адреса. С указателем на char, - другая история.
Речь, полагаю, о стандартном выводе в С++? std::cout?
Цитата Сообщение от IGPIGP Посмотреть сообщение
С указателем на char, - другая история.
Никакой другой истории, обычная перегрузка.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но тип, в числе прочего определяется допустимыми операциями и это значит, что раз указатель на char интерпретируется иначе чем другие, то и тип это другой?
Интерпретация и допустимые операции - совсем разные вещи. Для указателя на char допустимые операции точно такие же, как для любого другого указателя.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
13.05.2013, 20:40     В С++ может ли argv быть двухмерным массивом? #10
Немного проясню для тех, кто похоже чего-то не понимает
Нуль-терминатор это всего лишь условность. Разработчики языка С решили, что строки будут заканчиваться на 0, с таким же успехом они могли решить использовать для этого любой другой символ. В ассемблере (точнее в DOS), например, в качестве этого символа используется '$'.
Т.е. на С мы имеем
C++
1
"Hello, World!", 0;
а на ассемблере под DOS
Assembler
1
"Hello, World!", '$'
Никакого скрытого магического смысла завершающий символ не несет, и уж тем более не меняет свойства указателя, указывающего на строку его (завершающий символ) содержащую.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,490
Записей в блоге: 4
13.05.2013, 20:58     В С++ может ли argv быть двухмерным массивом? #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Интерпретация и допустимые операции - совсем разные вещи. Для указателя на char допустимые операции точно такие же, как для любого другого указателя.
Хорошо, пусть библиотеки, - не встроенные в язык средства. Но какой ещё указатель можно инициализировать, полагаясь на автоматическое завершение каким-то специальным образом:
char* a = "abcde";
Эта возможность называется операцией инициализации и встроена в язык.
Что касается таких библиотек как, стандартный поток вывода, то это тоже совсем не мало.
Указатель на char можно использовать и как указатель на символ, но можно и как указатель на С-строку. У компилятора нет средств определить, что имеется в виду не попробовав. Но в вопросе темы, - вопрос о 2-мерном массиве и важно было объяснить, что массив указателей на char, в данном случае массив массивов, то есть 2-х мерный. От таких же массивов других примитивных типов (int[] например), его размерность в строках может не совпадать, что является признаком схожим с контейнерами.
Я не стану спорить с тем, что указатель на char имеет много общего с указателями на другие типы, но отличия от них у него, достаточно существенны.

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

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

update: блин страницу не обновил)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 21:07     В С++ может ли argv быть двухмерным массивом?
Еще ссылки по теме:

В чем может быть ошибка? - C++
Вот программа: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; #include...

Память не может быть прочитала - C++
Здравствуйте, вот есть код: struct Dyn{ Syt select; Dyn* next; }; ............

В чём может быть ошибка? - C++
Описать функцию Power4(x,a,ξ) вещественного типа (параметры х, а, ξ - вещественные, |х|&gt;1; a,ξ &gt; 0), находящую приближенное значение...

Где может быть ошибка? - C++
#include &lt;iostream&gt; #include &lt;queue&gt; #include &lt;string&gt; using namespace std; int main(){ string s; queue&lt;string&gt;...

В чём может быть ошибка? - C++
Не пойму в чём ошибка в программе: #include &lt;iostream&gt; using namespace std; int main( ) // Program that...


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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,490
Записей в блоге: 4
13.05.2013, 21:07     В С++ может ли argv быть двухмерным массивом? #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Указатель инициализируется указателем - все стандартно, как и для всех типов
Указатель получает значение указателя, а инициализируется память. И память тут инициализируется скрывая присоединение символа завершения.

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
суть в том, что когда компилятор видит что-то в двойных ковычках
Собственно, всё можно свести к поведению компилятора.
Yandex
Объявления
13.05.2013, 21:07     В С++ может ли argv быть двухмерным массивом?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru