Прошу помощи, в простых ошибках

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем Yaponchick, 3 авг 2006.

Статус темы:
Закрыта.
  1. Yaponchick

    Yaponchick Гость

    Здраствуйте.
    Разъяните начинающему программисту.
    1) в чем отличия одинарных и двойных кавычек для типов char и char *
    2)
    Код (Text):
    char c3[8] = "1";
    char *c4[8] = {"1", "2", "3", "4", "5", "2", "3", "4"};

    cout << sizeof(c3); // 8
    cout << sizeof(*c4); // 4
    Почему у *c4 размер 4 байта ?!

    Заранее спасибо.
     
  2. SunSanych

    SunSanych Well-Known Member

    Регистрация:
    28 июн 2006
    Сообщения:
    71
    Симпатии:
    0
    c3 - это массив из 8-ми символов типа char или более просто - строка с 0x00 в конце, а
    с4 - массив из 8-ми указателей!!! на строки (почувствуй разницу).

    масив с3:
    адрес: ! 12000000 ! 12000001 ! 12000002 ! 12000003 ! 12000004 ! 12000005 ! 12000006 ! 12000007 !
    значение:! 0x31 ! 0x00 ! 0x00 ! 0x00 ! 0x00 ! 0x00 ! 0x00 ! 0x00 !
    с3 = 12000000

    масив с4:
    адрес: ! 12000010 ! 12000011 ! 12000012 ! 12000013 ! 12000014 ! 12000015 ! 12000016 ! 12000017 !
    значение:! 12000020 ! 12000030 ! 12000040 ! 12000050 ! 12000060 ! 12000070 ! 12000080 ! 12000090 !
    с4 = 12000010

    адрес 12000020 = 0x31, 0x00
    адрес 12000030 = 0x32, 0x00
    адрес 12000040 = 0x33, 0x00
    адрес 12000050 = 0x34, 0x00
    адрес 12000060 = 0x35, 0x00
    адрес 12000070 = 0x36, 0x00
    адрес 12000080 = 0x37, 0x00
    адрес 12000090 = 0x38, 0x00

    В реальных программах конечно не так, но очень похоже.
    А теперь ответ на вопрос: в первом операторе sizeof(c3) ты просишь вывести размер масива с3, и он занимает 8 байт, а во втором операторе sizeof(*c4) ты просишь вывести размер значения масива по адресу с4 (это тоже самое что c4[0]), а так как значениями массива являются указатели и в 32-х разрядных системах они занимают 4 байта, ты получаешь искомый результат.
    И, кстати, попробуй угадать, что получится, если написать sizeof(c4)? :)

    P.S. Вообще-то такие вещи можно посмотреть в отладчике (debuger по ихнему) :)

    Эх, все сдвинулось, а я так долго набивал :(
     
  3. Yaponchick

    Yaponchick Гость

    sizeof(c4) == 32 // сам угадал, потом проверил.

    У меня проблемы с указателями, не могли бы вы помочь понять их лучше(пример, ссылки).
    Опыт работы программирования есть(3/10 делфи, 9/10 пхп)
     
  4. Yaponchick

    Yaponchick Гость

    + Всё же, в чем же отличия кавычек ? ' "
     
  5. SunSanych

    SunSanych Well-Known Member

    Регистрация:
    28 июн 2006
    Сообщения:
    71
    Симпатии:
    0
    Если вкратце, то данные хранятся в ячейках памяти, которые имеют адрес (физический, виртуальный - сейчас неважно) и например, когда объявляется переменная int i = 1, то это значит, что в ячейку памяти по адресу i (компилятор переводит ее в число типа 0x00125436) надо занести число 1, и потом при встрече в тексте программы переменной i компилятор знает, что надо взять (или занести) данные из ячейки с адресом 0x125436.
    Так вот. Так как адрес - это число, то его тоже можно хранить в переменной, которая и называется указателем. Это удобно, например, когда надо передать большой массив в функцию или структуру (передается не сам массив размером несколько десятков, сотен байт, а указатель на него - 4 байта.
    Кроме того, при передаче указателя на переменную в функцию, последняя получает возможность напрямую поменять значение этой переменной. Т.е. надо быть осторожным.
    В итоге, указатели ускоряют работу программы за счет передачи в функции меньшего объема данных, но могут служить причиной труднообнаруживаемых ошибок. В С есть несколько приемов, которые позволяют программисту контролировать, чтобы никто не мог случайно "испортить" его данные, но все-равно он должен точно знать, что он делает.
    Вообще про указатели надо читать в книгах по С, С++, коих много. На форуме про все, что там есть не написать. Я в свое время учился по книге Герберта Шилда "Программирование на Borland C++". Поищи в интернете, наверняка она есть в электронном виде, но все-таки смею советовать потратить немного денежков и купить бумажный экземпляр (необязательно эту), ИМХО - это удобнее.
    А на счет кавычек, то насколько я понял ты имеешь в виду одинарные или двойные.
    Так вот, в одинарных определяются символы для переменной типа char.
    char ch = 'A';
    Компилятор переводит их ASCI-код.
    А в двойных ковычках определяются строки из ASCI символов закончивающихся кодом 0х00 (символ '0' в ASCI кодировке имеет код 0х30)
    Так как в С и С++ нет типа string, то строки хранятся как массивы типа char.
    char string[] = "Hello World!";
    int i = sizeof(string); // i=13 не забываем про завершающий 0.
     
  6. Yaponchick

    Yaponchick Гость

    Для: SunSanych
    Спасибо большое за пояснение, про указатели, я сам сейчас читаю C++ за 21 день(Джесс Либерти).
    Там про указатели плоховато написано.

    Про кавычки я догадывался, теперь понял =)

    Спасибо большое
     
  7. Yaponchick

    Yaponchick Гость

    Для: SunSanych
    Не могу найти функции типа chr/ord для перегона символ ASCII в его ASCII номер и обратно.
    Не подскажешь ? =)
     
  8. SunSanych

    SunSanych Well-Known Member

    Регистрация:
    28 июн 2006
    Сообщения:
    71
    Симпатии:
    0
    Мда, давненько я сюда не заходил. Наверно ты ответ уже и сам нашел. ;)
    Могу с большой долей уверенности сказать, что таких функций в стандартной боблиотеке нет,
    потому что их пишут все, кто только может и вопросами, типа "Как перевести десятичное число в 16-тиричное, как вывести число на экран?" и т.д. пестрят все форумы.
     
  9. babreonok

    babreonok Гость

    <!--QuoteBegin-SunSanych+12:08:2006, 07:55 -->
    <span class="vbquote">(SunSanych @ 12:08:2006, 07:55 )</span><!--QuoteEBegin-->Не могу найти функции типа chr/ord для перегона символ ASCII в его ASCII номер и обратно.
    Не подскажешь ? =)

    [snapback]42138" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    А в C/C++ таких функций нет! В сишке вполне корректным будет следующий код:
    .....
    int x;
    char ch;
    ch='a';
    x=xh;
    .....
    Преобразование типов здесь происходит при пресвоении значения переменной.
     
Загрузка...
Похожие Темы - Прошу помощи простых
  1. webwareroot
    Ответов:
    0
    Просмотров:
    113
  2. virusksv
    Ответов:
    2
    Просмотров:
    1.199
  3. beloff
    Ответов:
    5
    Просмотров:
    1.847
  4. nemo85
    Ответов:
    3
    Просмотров:
    1.477
  5. xavi
    Ответов:
    1
    Просмотров:
    1.827
Статус темы:
Закрыта.

Поделиться этой страницей