2015-01-05 3 views
-1

не уверен, как сформулировать название, но надеюсь, что он какой-то точный.C++ - Массивы указателей, почему это объявлено таким образом?

Я нашел этот код из книги, и я был в замешательстве, почему он объявлен таким образом (будучи новым для C++) и тем, что он на самом деле означает, потому что книга не объяснила это хорошо и меня смутила:

const char * const suit[4] = {"Hearts", "Diamonds", "Clubs", "Spades"}; 

Я не понимаю использование объявлений 2 const и как массив строк на самом деле представляет собой массив символов. Итак, если это c-строки, не должны ли они иметь длину 4? или потому, что они являются указателями, означает ли это, что это указывает на первый символ каждой строки?

Просто нужно, чтобы кто-то объяснил мне, что происходит, спасибо!

+1

какая книга? Это похоже на C++ с 1990-х годов. – Walter

+0

К сожалению, подобные вещи все еще преподаются в школах как то, что вы обычно используете. –

+0

Это C++ Как программировать, восьмое издание Paul Deitel & Harvey Deitel. Это был тот, который мне рекомендовал, и до сих пор это было хорошо. – Mayron

ответ

2

Строковый литерал - это массив в постоянной памяти (что означает, что char s в этом массиве являются неотъемлемо неизменными). Обычно мы представляем строки в стиле C с указателем на их первый символ. Для литерала, где char s - const, этот указатель имеет тип const char*.

Если вы хотите массив из 4 неизменных строк C-стиле, вы должны объявить что-то вроде этого:

const char* arr[4]; 

Каждый элемент этого массива является указателем, который вы можете указать на первый символ в Строка в стиле C. Если вы не будете нуждаться, чтобы изменить указатели в самом массиве, то вы можете также объявить указатели, как const:

const char* const arr[4]; 

Так был ясен, 4 здесь число строк в стиле С мы указываем. В вашем случае у вас есть строка для каждого из 4 костюмов в колоде карт.

+0

Спасибо, это имело большой смысл, но вы имеете в виду, что c-строки без const могут быть изменены в отличие от строк? Но с const вы не можете их изменить. Но я понимаю декларацию о двойном const, так что спасибо вам снова. – Mayron

+1

@Mayron A 'const char *' означает, что вы не можете изменить 'char', на которые указали. Строковый литерал, подобный '' hello "', представляет собой массив 'const char'. Вы не можете юридически сделать символ 'char *', который указывает на строковый литерал (потому что он позволит вам изменить литерал). –

+0

хорошо, поэтому c-строка отличается тем, что вы можете использовать char *? Итак, это одна из основных причин использования c-строк вместо строковых литералов? – Mayron

0
const char * const suit[4] 

Это говорит о том, что suit является массив из 4 const pointer в const char.

5

как массив строк на самом деле представляет собой массив символов.

Это не так. suit - массив из указателей персонажам. Таким образом, у вас есть 4 указателя, каждый из которых указывает на первый символ соответствующей строки.

Возможно, какое-то искусство ASCII поможет?

 +---+---+---+---+---+---+---+ 
    | H | e | a | r | t | s |NUL| 
    +---+---+---+---+---+---+---+ 
    ^
     | +---+---+---+---+---+---+---+---+---+ 
     | | D | i | a | m | o | n | d | s |NUL| 
     | +---+---+---+---+---+---+---+---+---+ 
     | ^
     | | +---+---+---+---+---+---+ 
     | | | C | l | u | b | s |NUL| 
     | | +---+---+---+---+---+---+ 
     | | ^
     | | | +---+---+---+---+---+---+---+ 
     | | | | S | p | a | d | e | s |NUL| 
     | | | +---+---+---+---+---+---+---+ 
     | | | ^
    +-|-+-|-+-|-+-|-+ 
suit | * | * | * | * | 
    +---+---+---+---+ 

Я не понимаю, использование 2 константных деклараций

Первый const означает, что символы не изменится, а второе означает, что указатели не изменится.

Смежные вопросы