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

  • Автор темы Yaponchick
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Y

Yaponchick

#1
Здраствуйте.
Разъяните начинающему программисту.
1) в чем отличия одинарных и двойных кавычек для типов char и char *
2)
Код:
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 байта ?!

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

SunSanych

Well-known member
28.06.2006
71
0
#2
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 по ихнему) :)

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

Yaponchick

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

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

SunSanych

Well-known member
28.06.2006
71
0
#5
Если вкратце, то данные хранятся в ячейках памяти, которые имеют адрес (физический, виртуальный - сейчас неважно) и например, когда объявляется переменная 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.
 
Y

Yaponchick

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

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

Спасибо большое
 
Y

Yaponchick

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

SunSanych

Well-known member
28.06.2006
71
0
#8
Мда, давненько я сюда не заходил. Наверно ты ответ уже и сам нашел. ;)
Могу с большой долей уверенности сказать, что таких функций в стандартной боблиотеке нет,
потому что их пишут все, кто только может и вопросами, типа "Как перевести десятичное число в 16-тиричное, как вывести число на экран?" и т.д. пестрят все форумы.
 
B

babreonok

#9
<!--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;
.....
Преобразование типов здесь происходит при пресвоении значения переменной.
 
Статус
Закрыто для дальнейших ответов.