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

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

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

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

09.05.2013, 17:23. Просмотров 1319. Ответов 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 ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 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
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
13.05.2013, 21:09     В С++ может ли argv быть двухмерным массивом? #17
Цитата Сообщение от IGPIGP Посмотреть сообщение
И память тут инициализируется скрывая присоединение символа завершения.
тогда еще и "равно" скрывает это:
C++
1
char * super_pointer("my string");
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
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!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
13.05.2013, 21:31     В С++ может ли argv быть двухмерным массивом? #19
IGPIGP, ну так "abcd" - это же и есть массив - char const [5].
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
13.05.2013, 21:42     В С++ может ли argv быть двухмерным массивом? #20
Цитата Сообщение от IGPIGP Посмотреть сообщение
то есть, такое ощущение, что это аналогично созданию массива:
То что Вы делаете, это UB - вы пишите в строковый литерал
Переменную типа int тоже можно рассмотреть как массив из sizeof(int) элементов типа char. И адрес этой int переменной будет адресом начала массива
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ваш пример инициализации "равно", кстати не содержит, зачем же о нём говорить?
Затем, что значение указателя инициализируется указателем
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
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
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
13.05.2013, 21:53     В С++ может ли argv быть двухмерным массивом? #22
Цитата Сообщение от IGPIGP Посмотреть сообщение
const это наше указание компилятору
Не в случае со строковыми литералами.
Так
C++
1
char buf[]="string";
создается массив, а так:
C++
1
char * buf="string"
указатель на константный строковый литерал.

Добавлено через 1 минуту
А запись в константную область памяти может запросто обернуться падением программы или еще чем похуже
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
13.05.2013, 21:53     В С++ может ли argv быть двухмерным массивом? #23
Цитата Сообщение от Croessmah Посмотреть сообщение
char buf[]="string";
Так и небыло.
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
13.05.2013, 21:54     В С++ может ли argv быть двухмерным массивом? #24
Одно дело слово const защищающий на уровне компилятора, другое дело то, что защищено не компилятором
gray_fox
What a waste!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
13.05.2013, 21:55     В С++ может ли argv быть двухмерным массивом? #25
Цитата Сообщение от IGPIGP Посмотреть сообщение
const это наше указание компилятору (которое при желании можно обойти)
Ну по поводу конст. Литералы константны по определению, в том числе и строковые. Изменение констант - неопределённое поведение.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
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!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 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
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
13.05.2013, 22:37     В С++ может ли argv быть двухмерным массивом? #28
Цитата Сообщение от gray_fox Посмотреть сообщение
Мне кажется, это особенность именно строковых литералов, а не char *.
Вот. Вы пишете "строковых" не задумываясь о том, что присвоить указатель на char можно началу памяти, которая содержит строку с признаком окончания (не просто ряд char'ов). Но есть литералы и не char, 123 - числовой литерал. Но тип определяется тем, что с ним можно делать? Вот эта особенность и отличает char от других. О библиотечных функциях я и не говорю.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.05.2013, 22:47     В С++ может ли argv быть двухмерным массивом? #29
По-моему, вы как-то далеко ушли от изначальной темы.
А на счет строковых литералов и особенного типа char, предлагаю еще вспомнить тип wchar_t.
До кучи еще и С++11 User-defined literals можно приплести.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 23:06     В С++ может ли 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...


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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 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" - всего лишь возвращает указатель на него. К слову, если у Вас одинаковый по содержанию литерал используется в разных местах, то скорее всего компилятор создаст только один, т.к. в их размножении нет никакого смысла.
Yandex
Объявления
13.05.2013, 23:06     В С++ может ли argv быть двухмерным массивом?
Ответ Создать тему
Опции темы

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