2014-02-13 3 views
5

Я попытался найти ответ для этого, но мне было очень трудно найти «точный» пример такого рода. Я очень мало понимаю о указателях указателей, и я чувствую, что под кожей есть что-то большее, чем просто указатель на что-то.C++ * const * const

Итак, как вы, ребята, переводите это?

void free(shame_1 * const * const group_1); 

Я прав, если я перевела его как const group_1 указатель на const указатель на shame_1?

Спасибо.

+3

'group_1' - это просто имя переменной. Таким образом, тип этой переменной является константным указателем на указатель const на 'shame_1'. Способ определения константы здесь означает, что вы не можете изменить значение 'group_1', а не' * group_1', но вы можете изменить значение '** group_1'. – jogojapan

+2

Если у вас возникли проблемы с чтением декларации C/C++, взгляните на [спиральное правило] (http://c-faq.com/decl/spiral.anderson.html). – zakinster

+0

Совет, который мне дал мой коллега, очень помогает мне: «Прочитайте тип справа налево». На данный момент это решает много путаницы, что я знаю это :) – rozina

ответ

5
shame_1 * const * const group_1; 

объявляет переменную с именем в 1 группе, тип которого является константный указатель (вы не можете изменить, где он указывает на) на другой константный указатель (то же самое) к shame_1 типа объекта, значение которого вы можете изменить.

Так, например, вы не можете скомпилировать:

group_1 = nullptr; 
*group_1 = nullptr; 

Вы можете, однако, сделать:

void f(shame_1& group) { 
    //stuff that modifies group 
    ... 
} 
f(**group1); 

Как zakinster заметил, имея взгляд на the spiral rule должно помочь вам понять этот вид нотации.

3

Вообще, просто читать справа налево:

void free(shame_1 * const * const group_1); 

free принимает параметр, называемый group_1 это const указатель на const указатель на shame_1 объекта.

  • Это не имеет значения здесь, но основная хлопот чтения справа налево, что некоторые люди используют T const * и другие используют const T* и они означают то же самое, так ли вы видите либо T const или const T вы должны прочитать как const T. В вашем коде только указатели const в любом случае.

Например:

shame_1 a_shame; 
const shame_1* p_a_shame = &a_shame; 
free(&p_a_shame); 

Там очень маленькая утилита в этом ... free() мог бы принял const указатель на shame_1 без дополнительного уровня косвенности, и все равно были бы в состоянии сделать все то же самое относится к shame_1, поэтому полезно, только если free() должен передать const -pointer-to- const -pointer для какой-либо другой функции (в конечном счете, не имея веской причины для всего беспорядка).

Вы можете визуализировать использования памяти/отношения как:

[a_shame] <------ [p_a_shame] <------ [group_1]* 
  • это, скорее всего, только в регистре процессора, хотя другие могут быть слишком после оптимизации.

я прав, если я перевести его как константный указатель на константные 1 группе указатель shame_1?

Итак, для меня «константного указатель 1 группы» бит немного подозреваемый ... Я думаю, что он читает лучше, так как «это 1 группа константный указатель на ...» или «константный указатель (так называемые 1 группа), чтобы ... ".

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