Что означает new char в с
Перейти к содержимому

Что означает new char в с

  • автор:

Моя любимая тема про выделение памяти, на этот раз new

Глупые вопросики,так что не закидывайте вилами,мб для кого-то это мега понятна,а кто-то я. Поделю 2 вопроса блоками. Блок1 Предположим,я выделил память,что я могу сюда записать и как могу разделить,а так же как могу использовать? Вопрос риторический,скорей сам себе для рассуждения

char *ptr =new char(20); //Или же char *ptr = malloc(05) 
  1. хочу 5 слов по 4 байта(символа) ptr[0]=’aaaa’;ptr[4]=’aaaa’)(и так ещё 3 раза,предположим что ‘aaaa’заняли 4 байта(1 буква — 1 байт),для наглядности) итого 20 байт-пожалуйста.
  2. Хочу 20 букв(символов) ptr[0]=’a’;ptr[1]=’a’)(и так ещё 18 раз,предположим что ‘a’заняла 1 байт(1буква-1байт),для наглядности) в сумме так же 20 байт-без проблем.

Так же, тут мои мысли,не больше я могу записать ну например,хочу ptr[0]=(int)123 и мы занимаем int ом 4 байта (1число 4 байта т.к. int ) и всего могу только 5 циферок записать на тип int и т.д. Смысл того что пихаю ногой и int значение, 5 int ов по 4 байта в сумме 20 байт выделенной памяти.

Блок2

И ещё момент,выделяем точно так же память,но.

char *ptr =new char(23) //Или же char *ptr = malloc(23); ptr[0]='aaaa'; char **ptrLine= (char**)ptr; ptrLine[0]=(char*)ptr[0]; 

И тут у меня небольшая трудность в понимании. Предположим дальше я занял немного памяти ptr[0]=’aaaa’ на 4 байта,ради примера(4 буквы ‘a’). И я получаю адрес на 0вой занятый 4мя байтами элемент.

И вдруг я захотел сделать что-то такое ptrLine[0]=(char*)ptr[0] .

И у меня вытекает 2 вопроса из моих блоков.

  1. Блок1 Правильно ли я понял и расписал свои мысли?
  2. Блок2 Что я сделал написав код ptrLine[0]=(char*)ptr[0] ? что мне это дало? (Не обязательно давать мне сложные примеры если вдруг они есть,мне достаточно описать словами,деревенским языком)

P.s. Про delete не забыл,прост это пример, чисто для моего понимания.

Работа со строками

Довольно большое количество задач, которые могут встретиться при разработке приложений, так или иначе связано с обработкой строк — парсинг веб-страниц, поиск в тексте, какие-то аналитические задачи, связанные с извлечением нужной информации из текста и т.д. Поэтому в этом плане работе со строками уделяется особое внимание.

В языке C# строковые значения представляет тип string , а вся функциональность работы с данным типом сосредоточена в классе System.String . Собственно string является псевдонимом для класса String. Объекты этого класса представляют текст как последовательность символов Unicode. Максимальный размер объекта String может составлять в памяти 2 ГБ, или около 1 миллиарда символов.

Создание строк

Создавать строки можно, как используя переменную типа string и присваивая ей значение, так и применяя один из конструкторов класса String:

string s1 = "hello"; string s2 = new String('a', 6); // результатом будет строка "aaaaaa" string s3 = new String(new char[] < 'w', 'o', 'r', 'l', 'd' >); string s4 = new String(new char[] < 'w', 'o', 'r', 'l', 'd' >, 1, 3); // orl Console.WriteLine(s1); // hello Console.WriteLine(s2); // aaaaaaa Console.WriteLine(s3); // world Console.WriteLine(s4); // orl

Конструктор String имеет различное число версий. Так, вызов конструктора

new String('a', 6)

6 раз повторит объект из первого параметра, то есть фактически создаст строку «aaaaaa».

Еще один конструктор принимает массив символов, из которых создается строка

string s3 = new String(new char[] < 'w', 'o', 'r', 'l', 'd' >);

Третий использованный выше в примере конструктор позволяет создать строку из части массива символов. Второй параметр передает начальный индекс, с которого извлкаются символы, а третий параметр указывает на количество символов:

string s4 = new String(new char[] < 'w', 'o', 'r', 'l', 'd' >, 1, 3); // orl

Строка как набор символов

Так как строка хранит коллекцию символов, в ней определен индексатор для доступа к этим символам:

public char this[int index]

Применяя индексатор, мы можем обратиться к строке как к массиву символов и получить по индексу любой из ее символов:

string message = "hello"; // получаем символ char firstChar = message[1]; // символ 'e' Console.WriteLine(firstChar); //e Console.WriteLine(message.Length); // длина строки

Используя свойство Length , как и в обычном массиве, можно получить длину строки.

Перебор строк

Класс String реализует интерфейс IEnumerable, благодаря чему строку можно перебрать в цикле foreach как набор объектов char. Также можно с помощью других типов циклов перебрать строку, применяя обращение к символам по индексу:

string message = «hello»; for(var i =0; i < message.Length; i++) < Console.WriteLine(message[i]); >foreach(var ch in message)

Сравнение строк

В отличие от других классов строки сравниваются по значению их символов, а не по ссылкам:

string message1 = "hello"; string message2 = "hello"; Console.WriteLine(message1 == message2); // true

Многострочные строки

Начиная с C# 11 с помощью трех пар двойных кавычек можно оформить многострочный текст, в том числе с применением интерполяции:

Print(); PrintValue("hello"); void Print() """; Console.WriteLine(text); > void PrintValue(string val) < string text = $""" """; //// или так //string text = $$""" // // // > // // // """; Console.WriteLine(text); >

Основные методы строк

Основная функциональность класса String раскрывается через его методы, среди которых можно выделить следующие:

  • Compare : сравнивает две строки с учетом текущей культуры (локали) пользователя
  • CompareOrdinal : сравнивает две строки без учета локали
  • Contains : определяет, содержится ли подстрока в строке
  • Concat : соединяет строки
  • CopyTo : копирует часть строки, начиная с определенного индекса в массив
  • EndsWith : определяет, совпадает ли конец строки с подстрокой
  • Format : форматирует строку
  • IndexOf : находит индекс первого вхождения символа или подстроки в строке
  • Insert : вставляет в строку подстроку
  • Join : соединяет элементы массива строк
  • LastIndexOf : находит индекс последнего вхождения символа или подстроки в строке
  • Replace : замещает в строке символ или подстроку другим символом или подстрокой
  • Split : разделяет одну строку на массив строк
  • Substring : извлекает из строки подстроку, начиная с указанной позиции
  • ToLower : переводит все символы строки в нижний регистр
  • ToUpper : переводит все символы строки в верхний регистр
  • Trim : удаляет начальные и конечные пробелы из строки

В следующих статьях разберем работу этих методов.

Объясните для чего нужен new char в СИ++. char *ch=new char[N]; gets(ch);

оператор new выделяет в памяти компьютера МЕСТО под переменную с типом CHAR и передает АДРЕС этого места ссылке *ch. Без оператора NEW нельзя создать ссылку, т. к. место не выделено.

Чтобы выделить память под массив байтов.
P.S. GAdge7, это не ссылка, а указатель. И место не просто под char; а под массив из N char. Сам по себе такой указатель можно запросто создать без new — char *ch; создаст такой указатель.
йцу уйц — в целом этот код создает ВО ВРЕМЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ массив для размещения в нем кодов N символов с указателем ch на его начало.

Похожие вопросы

Что означает new char в с

кто знает, что это за конструкция, какая память при этом выделяется,
или где можно прочитать про это
char* szBuffer = new char();

Re: что за конструкция new char()

От: Bell
Дата: 02.06.04 10:43
Оценка:

Здравствуйте, stdtan, Вы писали:

S>кто знает, что это за конструкция, какая память при этом выделяется,
S>или где можно прочитать про это
S>char* szBuffer = new char();

Выделяется динамическая память под один объект типа char, и этот объект инициализируется значением по умолчанию, т.е. нулем в данном случае.

Любите книгу — источник знаний (с) М.Горький
Re: что за конструкция new char()

От: Кодт
Дата: 02.06.04 10:44
Оценка:

Здравствуйте, stdtan, Вы писали:

S>кто знает, что это за конструкция, какая память при этом выделяется,
S>или где можно прочитать про это

S>char* szBuffer = new char();

выделяется 1 char.
Конструкция new T(ctor_args) означает размещение на куче объекта типа T, и выполнение его конструктора с указанными параметрами.
Для примитивных типов неявно определены конструктор без параметров и с 1 параметром.

Перекуём баги на фичи!
Re: что за конструкция new char()

От: Vamp
Дата: 02.06.04 10:45
Оценка: +1

S>или где можно прочитать про это
В любой книге по программированию на С++.
Да здравствует мыло душистое и веревка пушистая.
Re: что за конструкция new char()

От: stdtan
Дата: 02.06.04 10:52
Оценка:

все понятно
ввели в заблуждение скобки
оказывается это конструктор
спасибо.
Re[2]: что за конструкция new char()

От: Lorenzo_LAMAS
Дата: 02.06.04 11:38
Оценка:

S>>или где можно прочитать про это
V>В любой книге по программированию на С++.

Мне почему-то кажется, что не много авторов объясняют разницу между new char и new char(). Уверен ли ты, что это есть, допустими у Бьярна? (TCPL SE)

Of course, the code must be complete enough to compile and link.
Re[2]: что за конструкция new char()

От: Lorenzo_LAMAS
Дата: 02.06.04 11:39
Оценка:

да не конструктор это в данном случае.
Of course, the code must be complete enough to compile and link.
Re: что за конструкция new char()

От: Аноним
Дата: 02.06.04 11:41
Оценка:

Здравствуйте, stdtan, Вы писали:

S>кто знает, что это за конструкция, какая память при этом выделяется,
S>или где можно прочитать про это
S>char* szBuffer = new char();

то же самое что char *szBuffer=new char
;=)) выделяется sizeof(char) есст-сно

Re[3]: что за конструкция new char()

От: Vamp
Дата: 02.06.04 11:41
Оценка:

Уверен ли ты, что это есть, допустими у Бьярна? (TCPL SE)
Зуб не дам, но с достаточной уверенностью скажу, что в моем спецедишне это было.

Да здравствует мыло душистое и веревка пушистая.
Re[3]: что за конструкция new char()

От: 0xFADE github.com/NotImplemented
Дата: 02.06.04 11:47
Оценка:

Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>да не конструктор это в данном случае.
А как тогда, по-вашему это можно назвать?

Re[2]: что за конструкция new char()

От: Denwer
Дата: 02.06.04 11:52
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, stdtan, Вы писали:

S>>кто знает, что это за конструкция, какая память при этом выделяется,
S>>или где можно прочитать про это
S>>char* szBuffer = new char();

А>то же самое что char *szBuffer=new char
А> ;=)) выделяется sizeof(char) есст-сно

Это не одно и тоже, разница в инициализации по умолчанию.

Re[4]: что за конструкция new char()

От: Lorenzo_LAMAS
Дата: 02.06.04 12:07
Оценка:

Я лично с ходу найти не смог. Может это в приложениях? А так что-то не видать.
Of course, the code must be complete enough to compile and link.
Re[4]: что за конструкция new char()

От: Lorenzo_LAMAS
Дата: 02.06.04 12:36
Оценка: 2 (2)

L_L>>да не конструктор это в данном случае.
FAD>А как тогда, по-вашему это можно назвать?

5.3.4/15
-If the new-initializer is of the form (), default-initialization shall be performed (8.5);

Так как у нас тип char, default-initialize означает zero-initialize, что в свою очередь для скалярного типа означает

. the storage is set to the value of 0(zero) converted to T;

Of course, the code must be complete enough to compile and link.
Re[2]: что за конструкция new char()

От: Павел Кузнецов
Дата: 02.06.04 14:59
Оценка:

> Конструкция new T(ctor_args) означает размещение на куче объекта типа T, и выполнение его конструктора с указанными параметрами.

Не выполнение конструктора, а инициализацию. Выполнение конструктора — возможный, но не единственный вариант инициализации.

> Для примитивных типов неявно определены конструктор без параметров и с 1 параметром.

У встроенных типов конструкторов нет. В частности, инициализация значений встроенных типов не окружена точками следования, плюс, в отличие от типов с конструкторами, объекты встроенных типов остаются неинициализированными, если инициализатор не указан.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *