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

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

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

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

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

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

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

Что есть argc и **argv в функции int main(int argc, char **argv)? - C++
Здраствуйте, уважаемые кодеры! Что означает argc и **argv в функции int main(int argc, char **argv), ни как не могу понять эти переменные...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:08 #16
Цитата Сообщение от IGPIGP Посмотреть сообщение
Указатель получает значение указателя, а инициализируется память.
C++
1
const char *str = "asdf";
указатель str инициализируется "указателем" "asdf", потому что "asfd" после компиляции станет указателем. Вот это
C++
1
char ch = "asdf"[0];
вполне валидная операция, по причине, описанной выше.

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


Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
тогда еще и "равно" скрывает это:
нет, именно инициализация. Ваш пример инициализации "равно", кстати не содержит, зачем же о нём говорить?
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
13.05.2013, 21:31 #19
IGPIGP, ну так "abcd" - это же и есть массив - char const [5].
1
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
13.05.2013, 21:42 #20
Цитата Сообщение от IGPIGP Посмотреть сообщение
то есть, такое ощущение, что это аналогично созданию массива:
То что Вы делаете, это UB - вы пишите в строковый литерал
Переменную типа int тоже можно рассмотреть как массив из sizeof(int) элементов типа char. И адрес этой int переменной будет адресом начала массива
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ваш пример инициализации "равно", кстати не содержит, зачем же о нём говорить?
Затем, что значение указателя инициализируется указателем
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
13.05.2013, 21:50 #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;   
}
При этом к данным указателям применены и применимы разные опрерации
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
13.05.2013, 21:53 #22
Цитата Сообщение от IGPIGP Посмотреть сообщение
const это наше указание компилятору
Не в случае со строковыми литералами.
Так
C++
1
char buf[]="string";
создается массив, а так:
C++
1
char * buf="string"
указатель на константный строковый литерал.

Добавлено через 1 минуту
А запись в константную область памяти может запросто обернуться падением программы или еще чем похуже
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
13.05.2013, 21:53 #23
Цитата Сообщение от Croessmah Посмотреть сообщение
char buf[]="string";
Так и небыло.
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
13.05.2013, 21:54 #24
Одно дело слово const защищающий на уровне компилятора, другое дело то, что защищено не компилятором
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
13.05.2013, 21:55 #25
Цитата Сообщение от IGPIGP Посмотреть сообщение
const это наше указание компилятору (которое при желании можно обойти)
Ну по поводу конст. Литералы константны по определению, в том числе и строковые. Изменение констант - неопределённое поведение.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
13.05.2013, 22:21 #26
Цитата Сообщение от gray_fox Посмотреть сообщение
Ну по поводу конст. Литералы константны по определению, в том числе и строковые. Изменение констант - неопределённое поведение.
Неоднократно слышал об этом. И в первом примере конечно ошибся, то что мой компилятор это делает, не значит, что это нужно делать. Но вопрос же темы не о том? Вот тут два const указателя, синтаксически не отличимые, а типы - разные:
В С++ может ли argv быть двухмерным массивом?
Кроме того, возможность объявлять указатели на литералы есть только у char*. Нельзя же написать:
C++
1
2
3
const* int intConst=123;
или:
const* int intConst(123);
и это ли не ещё один особый (без кавычек) признак типа у char* ?
Вопрос же в теме был о массиве указателей на char. Оказывается, в данном случае это указатель на 2-х массив с разной размерностью строк (особых, - с нуль терминатором). Ничего похожего на массивы других встроенных типов.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
13.05.2013, 22:36 #27
Цитата Сообщение от IGPIGP Посмотреть сообщение
Кроме того, возможность объявлять указатели на литералы есть только у char*.
Мне кажется, это особенность именно строковых литералов, а не char *. Кроме них вроде нет больше литералов, которые представляли бы собой массив элементов, но ИМХО был бы литерал "массив цифр", можно было бы так же писать
C++
1
2
int const* p = <1234>;
int const (&ref)[5] = <1234>;
Добавлено через 7 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Оказывается, в данном случае это указатель на 2-х массив с разной размерностью строк (особых, - с нуль терминатором)
Ну так это просто массив указателей. Указатели указывают (хэх) на первые символы строк. То, что строки разной длинны к указателям ни как не относится, как и то, что С-строки заканчиваются особым символом. Собственно, как и то, что там вообще строки, а не одиночные char.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
13.05.2013, 22:37 #28
Цитата Сообщение от gray_fox Посмотреть сообщение
Мне кажется, это особенность именно строковых литералов, а не char *.
Вот. Вы пишете "строковых" не задумываясь о том, что присвоить указатель на char можно началу памяти, которая содержит строку с признаком окончания (не просто ряд char'ов). Но есть литералы и не char, 123 - числовой литерал. Но тип определяется тем, что с ним можно делать? Вот эта особенность и отличает char от других. О библиотечных функциях я и не говорю.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.05.2013, 22:47 #29
По-моему, вы как-то далеко ушли от изначальной темы.
А на счет строковых литералов и особенного типа char, предлагаю еще вспомнить тип wchar_t.
До кучи еще и С++11 User-defined literals можно приплести.
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
13.05.2013, 23:06 #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" - всего лишь возвращает указатель на него. К слову, если у Вас одинаковый по содержанию литерал используется в разных местах, то скорее всего компилятор создаст только один, т.к. в их размножении нет никакого смысла.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 23:06
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.05.2013, 23:06
Ответ Создать тему
Опции темы

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