Форум программистов, компьютерный форум 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 с двумя аргументами?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,703
Записей в блоге: 3
13.05.2013, 21:50     В С++ может ли argv быть двухмерным массивом? #21
Цитата Сообщение от gray_fox Посмотреть сообщение
IGPIGP, ну так "abcd" - это же и есть массив - char const [5].
И я про это.
const это наше указание компилятору (которое при желании можно обойти). Внутренне язык реализует инициализацию указателя на char принципиально разными способами... Конст тут ни причем. Хотите конст? Вот два разных способа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
int main(){
char a='a';
const char* pa=&a;//первый
const char* pb="abublic";//второй
cout<<*pa<<endl;
cout<<*pb<<endl;
if(*pa==*pb)cout<<"*pa = *pb"<<endl;
//cout<<pa<<endl;//не определено
cout<<pb<<endl;//нормально
system("pause");
return 0;   
}
При этом к данным указателям применены и применимы разные опрерации
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:53     В С++ может ли argv быть двухмерным массивом? #22
Цитата Сообщение от IGPIGP Посмотреть сообщение
const это наше указание компилятору
Не в случае со строковыми литералами.
Так
C++
1
char buf[]="string";
создается массив, а так:
C++
1
char * buf="string"
указатель на константный строковый литерал.

Добавлено через 1 минуту
А запись в константную область памяти может запросто обернуться падением программы или еще чем похуже
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,703
Записей в блоге: 3
13.05.2013, 21:53     В С++ может ли argv быть двухмерным массивом? #23
Цитата Сообщение от Croessmah Посмотреть сообщение
char buf[]="string";
Так и небыло.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:54     В С++ может ли argv быть двухмерным массивом? #24
Одно дело слово const защищающий на уровне компилятора, другое дело то, что защищено не компилятором
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
13.05.2013, 21:55     В С++ может ли argv быть двухмерным массивом? #25
Цитата Сообщение от IGPIGP Посмотреть сообщение
const это наше указание компилятору (которое при желании можно обойти)
Ну по поводу конст. Литералы константны по определению, в том числе и строковые. Изменение констант - неопределённое поведение.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,703
Записей в блоге: 3
13.05.2013, 22:21     В С++ может ли argv быть двухмерным массивом? #26
Цитата Сообщение от gray_fox Посмотреть сообщение
Ну по поводу конст. Литералы константны по определению, в том числе и строковые. Изменение констант - неопределённое поведение.
Неоднократно слышал об этом. И в первом примере конечно ошибся, то что мой компилятор это делает, не значит, что это нужно делать. Но вопрос же темы не о том? Вот тут два const указателя, синтаксически не отличимые, а типы - разные:
В С++ может ли argv быть двухмерным массивом?
Кроме того, возможность объявлять указатели на литералы есть только у char*. Нельзя же написать:
C++
1
2
3
const* int intConst=123;
или:
const* int intConst(123);
и это ли не ещё один особый (без кавычек) признак типа у char* ?
Вопрос же в теме был о массиве указателей на char. Оказывается, в данном случае это указатель на 2-х массив с разной размерностью строк (особых, - с нуль терминатором). Ничего похожего на массивы других встроенных типов.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
13.05.2013, 22:36     В С++ может ли argv быть двухмерным массивом? #27
Цитата Сообщение от IGPIGP Посмотреть сообщение
Кроме того, возможность объявлять указатели на литералы есть только у char*.
Мне кажется, это особенность именно строковых литералов, а не char *. Кроме них вроде нет больше литералов, которые представляли бы собой массив элементов, но ИМХО был бы литерал "массив цифр", можно было бы так же писать
C++
1
2
int const* p = <1234>;
int const (&ref)[5] = <1234>;
Добавлено через 7 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Оказывается, в данном случае это указатель на 2-х массив с разной размерностью строк (особых, - с нуль терминатором)
Ну так это просто массив указателей. Указатели указывают (хэх) на первые символы строк. То, что строки разной длинны к указателям ни как не относится, как и то, что С-строки заканчиваются особым символом. Собственно, как и то, что там вообще строки, а не одиночные char.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,703
Записей в блоге: 3
13.05.2013, 22:37     В С++ может ли argv быть двухмерным массивом? #28
Цитата Сообщение от gray_fox Посмотреть сообщение
Мне кажется, это особенность именно строковых литералов, а не char *.
Вот. Вы пишете "строковых" не задумываясь о том, что присвоить указатель на char можно началу памяти, которая содержит строку с признаком окончания (не просто ряд char'ов). Но есть литералы и не char, 123 - числовой литерал. Но тип определяется тем, что с ним можно делать? Вот эта особенность и отличает char от других. О библиотечных функциях я и не говорю.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.05.2013, 22:47     В С++ может ли argv быть двухмерным массивом? #29
По-моему, вы как-то далеко ушли от изначальной темы.
А на счет строковых литералов и особенного типа char, предлагаю еще вспомнить тип wchar_t.
До кучи еще и С++11 User-defined literals можно приплести.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 23:06     В С++ может ли argv быть двухмерным массивом? #30
Подведем итог!
C++
1
char * str="abcde";
Указатель str на константный строковый литерал. От других указателей ничем не отличается - такой же указатель!
Вся "супер-функциональность" это лишь разнообразные перегрузки.
К "abcde" в конце прибавляется нуль - это опять же особенность не указателя на char, а просто синтаксический сахар, позволяющий писать именно строку "abcde", а не "abcde\0".
Невозможно другому типу сделать такое присвоение? Почему же нельзя? Вот:
C++
1
2
3
4
5
const int cnst_arr[5]={3,6,8,2,3};
 
int main(){ 
    int * arr=const_cast<int*>(cnst_arr);
}
Со строковым литералом тоже самое - лежит он где-то в другом месте, а "abcde" - всего лишь возвращает указатель на него. К слову, если у Вас одинаковый по содержанию литерал используется в разных местах, то скорее всего компилятор создаст только один, т.к. в их размножении нет никакого смысла.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
13.05.2013, 23:06     В С++ может ли argv быть двухмерным массивом? #31
IGPIGP, я не уловил вашу мысль. С моей точки зрения: строковый литерал - это массив элементов (символов), а имя массива неявно преобразуется в указатель на первый элемент. Возможно есть особые правила на этот счёт, что бы можно было писать char const* str = "...", я не знаю. Но char, wchar_t и пр. сами по себе к этому отношения не имеют.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,703
Записей в блоге: 3
13.05.2013, 23:28     В С++ может ли argv быть двухмерным массивом? #32
Цитата Сообщение от Croessmah Посмотреть сообщение
Указатель str на константный строковый литерал. От других указателей ничем не отличается - такой же указатель! Вся "супер-функциональность" это лишь разнообразные перегрузки.
Да всё это просто. Можно объяснить, что компилятор себя ведёт иначе когда строковый литерал видит, можно особенностью перегрузки... Но особенность типа и состоит в том, что он особенный и это тоже просто.
Цитата Сообщение от gray_fox Посмотреть сообщение
С моей точки зрения: строковый литерал - это массив элементов (символов), а имя массива неявно преобразуется в указатель на первый элемент.
С моей - нет. Вот массив символов:
char* chArr = new char[3];
C++
1
2
3
chArr [0]='a';
chArr [1]='b';
chArr [2]='c';
Этот указатель можно передать в функцию с длиной n=3 и это стиль работы с обычным массивом любого типа.
А такой массив - С-строка:
C++
1
2
3
chArr [0]='a';
chArr [1]='b';
chArr [2]='\0';
и это:
C++
1
const char *chArr="ab";//тут сам язык всё делает
и передавать его можно без размера и печатать cout << chArr;
и эта возможность сбивает с толку новичков. Особенно когда только начинают знакомиться с указателями, массивами и ссылками. Невдомёк им почему когда в функцию передаётся int* a без размера (дополнительного целого) и нет глобального его объявления, то ясно что по указателю передано одно целое, а когда передано char* a, то строка это или одиночный символ нужно знать самому. То есть может быть и строка, чего с другими типами быть не может. Тема именно об этом.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 00:14     В С++ может ли argv быть двухмерным массивом? #33
Цитата Сообщение от IGPIGP Посмотреть сообщение
и передавать его можно без размера и печатать cout << chArr;
Это лишь соглашение, ставшее стандартом
Можете выдвинуть свое соглашение для массивов других типов, может приживется
Цитата Сообщение от IGPIGP Посмотреть сообщение
А такой массив - С-строка:
C-строка - это такой же массив чисел. Просто принято, что нулевой элемент считается последним в текущей последовательности. Во-первых, обеспечивает некоторую гибкость, во-вторых лучше задействовать один байт памяти для нуля, чем несколько для хранения длины строки, так же сравнение с нулем быстрее и т.д.

Цитата Сообщение от IGPIGP Посмотреть сообщение
почему когда в функцию передаётся int* a без размера (дополнительного целого) и нет глобального его объявления, то ясно что по указателю передано одно целое, а когда передано char* a, то строка это или одиночный символ нужно знать самому.
По-моему, Си-строки описываются в любом учебнике и если читать нормально, а не через страницу, то обязательно на это наткнешься в первых же главах.
то ясно что по указателю передано одно целое, а когда передано char* a, то строка это или одиночный символ нужно знать самому.
С чего вдруг? Если принимаем указатель на целое, то это может быть как указатель на одиночное значение, так и указатель на начало блока памяти где лежит куча таких целых

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
А такой массив - С-строка:
C++
1
2
3
chArr [0]='a';
chArr [1]='b';
chArr [2]='\0';
не равно этому:
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
const char *chArr="ab"; //тут сам язык всё делает
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,703
Записей в блоге: 3
14.05.2013, 00:27     В С++ может ли argv быть двухмерным массивом? #34
Цитата Сообщение от Croessmah Посмотреть сообщение
Можете выдвинуть свое соглашение для массивов других типов, может приживется
Спасибо за приглашение. Для этого придётся переписать все библиотеки. Тип это и есть стандарт и это просто. Также просто как и то, что только с-строка из встроенных типов знает свой размер. Немного освобожусь и найду цитату где её величают "почти контейнером".
У Б.Страуструпа есть пример где он показывает, что первым шагом от массива к вектору могло бы быть резервирование нулевого индекса для хранения размера. То есть просто по большому счету. Просто один, - массив, а другой, - уже нечто большее.
Цитата Сообщение от Croessmah Посмотреть сообщение
не равно этому:
я это и имел в виду. Прочтите пост.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 00:38     В С++ может ли argv быть двухмерным массивом? #35
Цитата Сообщение от IGPIGP Посмотреть сообщение
с-строка из встроенных типов знает свой размер.
ничего она не знает, просто функции ищут ноль и всё, так же как Вы ищите дом с определенным номером на улице, и там где Вы его нашли - не факт, что это конец улицы.
У Вас лишь соглашение, что дом с номером ноль является конечным пунктом Вашего похода
C++
1
char * str="abc\0def";
Размер строки далеко не 3, хотя для стандартных функций именно 3+нулевой символ
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,703
Записей в блоге: 3
14.05.2013, 00:45     В С++ может ли argv быть двухмерным массивом? #36
Цитата Сообщение от Croessmah Посмотреть сообщение
ничего она не знает, просто функции ищут ноль и всё
У массива int не ищут. Croessmah, я понял ход Ваших рассуждений и думаю, доказать ничего не смогу. Ваши аргументы меня тоже не убеждают. Я буду говорить: массив char это массив, с-строка это с-строка. Вы будете говорить что с-строка это массив, только просто чуть-чуть "не такой". А дело же в чуть-чуть и есть.
Цитата Сообщение от Croessmah Посмотреть сообщение
Размер строки далеко не 4, хотя для стандартных функций именно 4
Угу, для функции main в частности. О которой поначалу и шла речь.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 00:51     В С++ может ли argv быть двухмерным массивом? #37
Цитата Сообщение от IGPIGP Посмотреть сообщение
У массива int не ищут.
А как Вы себе это представляете? Можно, конечно же, зарезервировать какое-то определенное число для обозначения конца массива, но числа такая вещь, которое может равняться чему угодно и если у меня в результате вычислений один из элементов массива получится равным этому самому "концу", то это будет не конец массива, а конец программе
Ну и да, нам друг друга не понять, ибо:
Вы будете говорить что с-строка это массив, только просто чуть-чуть "не такой".
Абсолютно одинаковый - вот ход моих мыслей!
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,703
Записей в блоге: 3
14.05.2013, 01:05     В С++ может ли argv быть двухмерным массивом? #38
Цитата Сообщение от Croessmah Посмотреть сообщение
Абсолютно одинаковый - вот ход моих мыслей!
Тогда скажите может ли компилятор самостоятельно различить массивы:
{'a', 'b', 'c'};
и
{'a', 'b', 'c','\0'};
без риска UB?
Для массивов:
{1,2,3,4}
такая задача не стоит. Никто в здравом уме не передаст int* , если размер как-то не оговорен. Такое возможно только с типом char*.
Спасибо, за дискуссию.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
14.05.2013, 06:06     В С++ может ли argv быть двухмерным массивом? #39
Цитата Сообщение от IGPIGP Посмотреть сообщение
если размер как-то не оговорен.
Вот оно - оговореннуй нуль-терминатор!

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тогда скажите может ли компилятор самостоятельно различить массивы:
А это задача не компилятора

Добавлено через 58 секунд
Цитата Сообщение от IGPIGP Посмотреть сообщение
Такое возможно только с типом char*.
Такое возможно с любым типом, по договоренности
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 06:31     В С++ может ли argv быть двухмерным массивом?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.05.2013, 06:31     В С++ может ли argv быть двухмерным массивом? #40
Цитата Сообщение от Князь Трех Море Посмотреть сообщение
Вот что это означает?
Когда у argv с двумя аргументами?
argv не может иметь других размерностей, он всегда плоский: argv - массив строк, а строка - массив символов.

Добавлено через 6 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
В ассемблере (точнее в DOS), например, в качестве этого символа используется '$'.
Не в ассемблере, а по соглашению, поддерживаемому функциями ввода-вывода. C можно оттранслировать на язык ассемблера, при этом терминальным останется 0.

Добавлено через 4 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Хорошо, пусть библиотеки, - не встроенные в язык средства. Но какой ещё указатель можно инициализировать, полагаясь на автоматическое завершение каким-то специальным образом:
char* a = "abcde";
Эта возможность называется операцией инициализации и встроена в язык.
Что касается таких библиотек как, стандартный поток вывода, то это тоже совсем не мало.
Указатель на char можно использовать и как указатель на символ, но можно и как указатель на С-строку. У компилятора нет средств определить, что имеется в виду не попробовав. Но в вопросе темы, - вопрос о 2-мерном массиве и важно было объяснить, что массив указателей на char, в данном случае массив массивов, то есть 2-х мерный. От таких же массивов других примитивных типов (int[] например), его размерность в строках может не совпадать, что является признаком схожим с контейнерами.
Я не стану спорить с тем, что указатель на char имеет много общего с указателями на другие типы, но отличия от них у него, достаточно существенны.


Да хоть, чем бы ни завершался. Скрытым он является при интерпретации и инициализации. А желание понять, оно или есть или его нет. Обращайтесь в первом лице, в обморок не упаду.
Добавлено через 3 минутыединственное отличие в инициализации явно-константным массивом.
Yandex
Объявления
14.05.2013, 06:31     В С++ может ли argv быть двухмерным массивом?
Ответ Создать тему
Опции темы

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