654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|||||||||||
1 | |||||||||||
В чем разница между char* и char[]?01.10.2014, 18:28. Показов 21139. Ответов 69
Метки нет (Все метки)
Доброго времени суток, наткнулся на одну загвоздку есть такой кусок кода
второй норм. Разъясните пожалуйста
0
|
01.10.2014, 18:28 | |
Ответы с готовыми решениями:
69
В чем разница между char* и char ** Разница между char и signed char Разница между char[] и char* Разница между new char[] и new char[]() |
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
|
|
01.10.2014, 21:24 | 21 |
1
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
01.10.2014, 22:13 [ТС] | 22 |
всем спасибо, сегодня сходу не смог разобраться в этом...жалко, а все достаточно очевидно
0
|
01.10.2014, 22:14 | 23 |
Убеждённый не с этим спорил. Он спорил с тем, должен ли компилятор выдавать ошибку. Деление на ноль - это код, который приведёт к слому на исполнении. Но компилятор там не должен выдавать ошибку. Так и здесь
P.S. А за то, что собрали распространённые ошибки в одно место - это вы просто молодцы. Главное, чтобы не гнались за количеством, а то оно превратится в помойку, которую не осилит ни один начинающий программист Добавлено через 44 секунды А по теме вопроса - на всякий случай ссылка: https://www.cyberforum.ru/blogs/18334/blog97.html
1
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
||||||
01.10.2014, 22:23 | 24 | |||||
Нет не так. В С++ система типов строже чем в С, и константность без явного приведения снять нельзя (пункт стандарта я уже указал выше). С другими типами, отличными от char (и wchar_t), такое уже не пройдет.
А вот в С такое запросто можно делать.
0
|
Почетный модератор
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
|
01.10.2014, 22:48 | 26 |
Нет, на C++11, там на сайте справа указывается
0
|
Ушел с форума
|
|
01.10.2014, 23:26 | 28 |
Я против навешивания ярлыков "адекватный-неадекватный" на основании одного примера.
Признаю, был неправ. Компилятор, которым пользуется ТС, в данном вопросе ведет себя неадекватно.
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
01.10.2014, 23:46 | 29 |
Мне кажется с твоей стороны нет желания понять, что я имел в виду. Объясню еще раз:
1) Компилятор должен соответствовать стандарту. 2) Компилятор может вносить свои расширения. И даже включать их по умолчанию. 3) Компилятор должен иметь средства эти расширения отключить. 4) Или компилятор должен иметь средства показать пользователю, что используются нестандартные расширения. Если все эти пункты не выполняются, то компилятор не адекватен. Яркий пример: Borland C++ 3.1. С чего ты вдруг решил, что я навешиваю какие-то ярлыки, мне не понятно. Добавлено через 8 минут Еще раз приведу цитату: Это это, очевидно, значит, что я и не собирался навешивать ярлыки. Я предположил одновременно, что компилятор может быть как адекватным, но с отключенной диагностикой (что ты продемонстрировал на примере ideone.com), так и неадекватный. Как из двойственности этого утверждения следует, что я навесил ярлык? Когда навешивают ярлык, говорят безапелляционно. Без рассмотрения двух противоположных случаев. Не по теме: В общем, лично я разочарован в аргументах этой дискуссии.
0
|
Комп_Оратор)
|
||||||
02.10.2014, 00:38 | 30 | |||||
aLarman,
1
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||||||
02.10.2014, 11:24 [ТС] | 31 | |||||
Не по теме: IGPIGP, спасибо, я уже прочитал про стр.литералы :) Добавлено через 1 час 56 минут кстати, gcc 4.8.2 вывод
0
|
IGPIGP
|
02.10.2014, 12:38
#32
|
Не по теме: Дык и я прочитал. Дело в том, что когда я решил наваять, в теме было затишье. С моим зрением такой постик требует немного времени. :pardon: А когда подключился и разместил, увидел 2-ю страницу и ссыль на блог Evg. Так что многое совпало. :pardon: Ну то есть между char* и char[] разница в том, что это совершенно разные вещи. А инициализация указателей и массивов строковыми литералами, действительно отличает указатели и массивы char от указателей и массивов любого другого встроенного типа. И вдобавок их инициализация сильно отличается между собой при сходности синтаксиса. Это настоящий праздник для новичка, поэтому имхо: к чарам стоит приступать, когда тема указатели и массивы для других встроенных типов от зубов отскакивает. Не прозвучало ещё и то, что указатель на char это указатель на один символ (оно вроде и понятно, но в терминологии часто встретишь - строка, массив и имеет смысл, это акцентировать для новичков) и то что массивы char, это не всегда c-строки, а c-строки это всегда массивы char. В целом статья Evg - очень хороша. Удачи. :)
0
|
02.10.2014, 13:04 | 33 |
Строго говоря, это не верно. Указатель - он просто указатель в какой-то адрес памяти. А на какое количество char'ов он указывает - про это ведает только программист, обычный процессор про это ничего не знает. Т.е. в данном примере
C char a[4] = { 'a', 'b', 'c', '\0' }; char b; char *p1 = a; char *p2 = &b;
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||||||
02.10.2014, 13:20 | 34 | |||||
Очень даже верно. Указатель может указывать на char ( const char * ), а может указывать на массив из n элементов ( const char[n] * )
0
|
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|
02.10.2014, 14:05 | 35 |
это уже указатель на указатель получается, а там говорилось о простом указателе на char.
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
02.10.2014, 14:14 | 36 |
Не, это именно что указатель на массив. Указатель на указатель на char - const char **
0
|
02.10.2014, 14:27 | 37 |
А ещё может указывать на int и на float. Я знаю.
Если отбросить сарказм, то при чём тут указатель на массив char'ов, когда было русским языком сказано про указатель на char. Ну и, если вдруг ты не знаешь, то указатель на char и указатель на массив char'ов - это две разные вещи (точно так же, как указатель на char и указатель на int)
1
|
Комп_Оратор)
|
|
02.10.2014, 17:02 | 38 |
И это значит, что char * это указатель на один символ. Далее функция которая заточена под строки будет искать терминатор, а не заточенная, - не будет. Указывая на символ внутрь строки - получим символ или подстроку начинаемую этим символом. То есть указывать это указывать на символ, а как этот адрес интерпретировать, это не дело указателя.
Абсолютно согласен. Указатель на массив это уже третье. А массисв типа и указатель на тип, новички часто путают. Массив это имя которое неявно преобразуется к указателю Type * const. То есть его нельзя использовать в правой части выражений адресной арифметики или инкрементировать, но в левой - везде где ожидается указатель, такое имя можно использовать или передать аргументом в функцию, где формальный параметр - указатель. Вообще, нюансов столько, что можно час говорить и неделю охать: -" Эх, ещё то надо было... и вот об этом забыли...".
0
|
Tulosba
|
02.10.2014, 17:14
#39
|
0
|
Комп_Оратор)
|
|
02.10.2014, 18:48 | 40 |
Да, лево и право перепутал. Хотел: <<То есть его нельзя использовать в левой части выражений адресной арифметики или инкрементировать, но в правой - везде где ожидается указатель...>> Я помню, длиннющий холивар, где я и Croessmah, говорили о том, указатель ли это на символ или на массив. Тогда я, кстати, доказывал, что на массив, а Саша твёрдо отстаивал классическую точку зрения. Он говорил, что на символ, потому как разыменование даёт символ и потому, что синтаксически и пр. А похоже на массив потому, что так перегружены операторы сдвига потоков, написаны библиотеки, но это же не компилятор... Я злорадствовал, что если у плюсов отрезать std и библиотеки включая iostream то это будет С--, для которого придётся всё другое написать и это легче, чем кого-то потом убедить, что это тоже С++ и им можно пользоваться. Добивающим доводом, если я верно помню, было то, что несмотря на то, что большинство операторов (==, >, + и пр.) перегружены как для символа, но оператор [] сделан так, что имя указателя можно использовать как имя массива для индексного обращения к памяти как к массиву типа. И при этом неважно инициализирован указатель (в куче) указателем на массив памяти - new char[] или одним new char. Это верно не только для указателей на char (). И кто был прав? Строго говоря, - оба (имхо). Это место в языке достаточно противоречиво и тут главное не спорить, а понять что хотел сказать оппонент. Не по теме: Тогда мы с Сашей и подружились. В чём смысл подобных разговоров? Думаю в том, чтобы побудить новичков вернуться к простым типам, если они не уверены, что массивы и указатели знают хорошо, перед тем как взяться за чары. И в том, чтобы напомнить опытным, что может быть непонятно новичку в этой теме.
0
|
02.10.2014, 18:48 | |
02.10.2014, 18:48 | |
Помогаю со студенческими работами здесь
40
(char)xx и '\xx' - в чём разница? Разница между char и int Строка: чем отличается строки string, char, char*? Чем отличается const char* от char*? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |