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

Чем по умолчанию инициализируется символьный массив? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Создать символьную матрицу http://www.cyberforum.ru/cpp-beginners/thread147168.html
Пытаюсь создать символьную матрицу для колоды карт: class Card { char card; public: Card() { card={"6-CH"}; //задание карт cars={"6-KR"}; card={"6-TR"};
C++ Перевод чисел из десятичной системы счисления в двоичную, восьмеричную, шестнадцатеричную напишите код программы для проверки перевода чисел из десятичной системы счисления в двоичную,восьмеричную,шестнадцатеричную на языке С главный принцип в создании программы тоесть когда пользователь программы на листочке отдельно переводит числа , а затем вводит их в программу а программа их проверяет правильно ли он перевёл http://www.cyberforum.ru/cpp-beginners/thread147165.html
Перевод из десятичной системы счисления в двоичную, восьмеричную, 16-ричную C++
создание программы для проверки перевода чисел из десятичной системы счисления в двоичную,восьмеричную,шестнадцатеричную на языке С ПРИМЕЧАНИЕ тоесть когда пользователь программы на листочке отдельно переводит числа , а затем вводит их в программу а программа их проверяет правильно ли он перевёл
C++ Сортировка участка матрицы
Помогите пожалуйста, надо на С++ написать такую прогу: пользователь вводит размерность квадратной матрицы, она рандомно заполняется элементами от 0 до 99, выводится на экран. Затем ее участок (на рисунке) сортируется: столбцы по возрастанию, а все остальное заполняется нулями. Отсортированная матрица выводится на экран. Сделать все надо через подпрограммы, т. е. раздел main должен содержать...
C++ строка символов http://www.cyberforum.ru/cpp-beginners/thread147129.html
определить функцию для расчета количества букв 'н' в предложении
C++ Создание программы для обучения переводу чисел в другие системы счисления напишите программу ДЛЯ ОБУЧЕНИЯ ПЕРЕВОДУ чисел из десятичной системы счисления в двоичную,восьмеричную,шестнадцатеричную подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
19.06.2010, 11:55     Чем по умолчанию инициализируется символьный массив?
Aye Aye, мусора на конце строки не будет

Если объяснять на пальцах, то в Си описание переменных можно сделать двумя способами:
  • "описание переменной;" (например "int x;" или "char a[10];") - переменная заводится но НЕ инициализируется. В этом случае глобальная переменная обнуляется, а локальная забивается мусором
  • "описание переменной = инициализатор;" (например "int x = 4;" или "char a[10] = { 'a', 'b' };"). В этом случае переменная инициализируется. Если переменная представляет собой массив или структуру, а инициализатор содержит меньше констант, чем требует того переменная, то вся оставшаяся часть переменной обнуляется

Таким образом при описании "char a[10] = { 'a', 'b' };" первые два элемента массива инициализируются значениями 'a' и 'b', а оставшиеся 8 элементов прописываются нулями. Языки Си/Си++ позволяют использовать строки (или более правильно название "строковые литералы") в качестве инициализаторов. В этом случае, например, строка "ab" трактуется как инициализатор из трёх элементов и эквивалентен { 'a', 'b', '\0' }.

Мы видим, что при инициализации массива char'ов строкой, инициализатор содержит на один элемент больше, чем если бы мы инициализировали через фигурные скобки. В следующих двух записях

C
1
2
char s[10] = { 'a', 'b' };
char s[10] = "ab";
по факту инициализация в обоих случаях будет одинакова, несмотря на то, что инициализаторы трактуются немного по разному. Но это происходит из-за того, что размер массива больше размера инициализатора и оставшиеся элементы прописываются нулями. Но вот две следующие инициализации НЕ эквивалентны

C
1
2
char s[] = { 'a', 'b' };
char s[] = "ab";
В первом случае массив s будет содержать два элемента, а во втором - три.

Краткий итог

1. При инициализации аггрегатной (составной) переменной неинициализированных хвост прописывается нулями
2. При инициализации массива char'ов строковой литерал трактуется как инициализатор из char'ов с нулём на конце. Т.е. две следующие записи строго эквивалентны

C
1
2
char s[10] = "ab";
char s[10] = { 'a', 'b', '\0' };
при этом с учётом пункта 1 обе записи трактуются как

C
1
char s[10] = { 'a', 'b', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' };
 
Текущее время: 22:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru