Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2015, 03:20   #1
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию Разница между char ch[] = {'a','b','c'}; и char ch[] = "abc";

У меня простая программа выводит вот такие данные в консоль.

Есть два масива типа char, но инициализируются они по другому.

Если если просто вывести как показано ниже, то резаультат не такой как ожидается.
Но если перебирать все в цикле, то все верно выходит

Код:

    char arr_1[] = "hello";
    char arr_2[] = { 'h','e','l','l','o' }; 

    cout << "|" << arr_1 << "|" << endl; // |hello|
    cout << "|" << arr_2 << "|" << endl; // |hellohello|



Вся программа, на всякий случай. g++ под Linux Debian i386
Код:
#include <iostream>

// ===========================================================================
using namespace std;

int main(int argc, char const *argv[]){


    char arr_1[] = "hello";
    char arr_2[] = { 'h','e','l','l','o' }; 


    cout << "-----------------------------------------" << endl;
    cout << "|" << arr_1 << "|" << endl; // |hello|

    for (int i = 0; i < sizeof(arr_1); i++){
        cout << i << " : " << arr_1[i] << " : " << (int)arr_1[i] << endl;
    }

    cout << "-----------------------------------------" << endl;
    cout << "|" << arr_2 << "|" << endl; // |hellohello|

    for (int i = 0; i < sizeof(arr_2); i++){
        cout << i << " : " << arr_2[i] << " : " << (int)arr_2[i] << endl;
    }



    return 0;
}

// ===========================================================================

Вывод программы в консоль:



Код:
toor@localhost:/m-sys/prog/cpp/edu/arrays/char$ ./Make.sh && ./Prog 
-----------------------------------------
|hello|
0 : h : 104
1 : e : 101
2 : l : 108
3 : l : 108
4 : o : 111
5 :  : 0
-----------------------------------------
|hellohello|
0 : h : 104
1 : e : 101
2 : l : 108
3 : l : 108
4 : o : 111
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 25.11.2015, 04:58   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
    char arr_1[] = "hello";
    char arr_2[] = { 'h','e','l','l','o' }; 
    cout << hex << &arr_1 << " " << hex << &arr_2 << endl;
arr_1 с нультерминантом, а arr_2 - без него. При этом arr_2 оказалось ровно перед arr_1. Печать происходит до первого нультерминанта, так что при печати arr_2 по сути печатается arr_2arr_1.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.11.2015, 06:07   #3
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Спасибо, все стало понятно.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 25.11.2015, 11:48   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

arr_2 - это "канонический" способ инициализации массива, независимо от типа.
arr_1 - это исключение специально для строк, иначе задолбаетесь создавать строки.
waleri вне форума Ответить с цитированием
Старый 26.11.2015, 00:07   #5
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Понял. Спасибо.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 26.11.2015, 18:57   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

кстати.

мало кто знает, что инициализация
char c[3] = "abc";
валидна в С (инициализируем массив из 3-х байт), но не в С++ (компилятор ругнется, что не хватает места для строки).

Так то!
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 26.11.2015, 21:53   #7
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
мало кто знает
и такие есть?
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
char x[] = "\x00ABC"; получается 0x0abc goluzov Общие вопросы C/C++ 2 25.10.2012 11:23
заместо 40 символов можно поставить чето типа char * x = x40 "f"; goluzov Общие вопросы C/C++ 10 27.08.2012 07:18
Какова разница между "int** &a" и "int** a" в кач-ве параметра функции? dollemika Помощь студентам 3 15.01.2012 17:16
отличие char* str ="..." от char ...[]="..." StarWorm Общие вопросы C/C++ 2 20.11.2008 08:48
C++, препроцессор, как из "int" сделать "char"? Максай Помощь студентам 3 05.09.2008 08:16