Что от указателя к указателю константы означает в C и в C++?

для одномерного массива, который вы можете просто использовать:

arr1.sort().toString() == arr2.sort().toString()

, это также позаботится о массиве с несогласованным индексом.

42
задан xsl 3 December 2008 в 20:33
поделиться

7 ответов

Ваш коллега неправ. Это - (неконстанта) указатель на (неконстанта) указатель на константу MyStructure. И в C и в C++.

63
ответ дан James Hopkin 23 September 2019 в 13:15
поделиться

В таких случаях инструмент cdecl (или C++ decl) может быть полезным:

     [flolo@titan ~]$ cdecl explain "const struct s** ppMyStruct"
     declare ppMyStruct as pointer to pointer to const struct s
60
ответ дан flolo 23 September 2019 в 13:15
поделиться

Вы были правы в своей интерпретации. Вот другой способ посмотреть на него:

const MyStructure *      *ppMyStruct;        // ptr --> ptr --> const MyStructure
      MyStructure *const *ppMyStruct;        // ptr --> const ptr --> MyStructure
      MyStructure *      *const ppMyStruct;  // const ptr --> ptr --> MyStructure

Это все альтернативы для от указателя к указателю с одним спецификатором константы. Справа налево правило может использоваться для дешифровки объявлений (по крайней мере, в C++; я не эксперт C).

20
ответ дан efotinis 23 September 2019 в 13:15
поделиться

Вы правы.

Другой ответ уже указал" По часовой стрелке Правило На спирали". Мне понравился тот очень - немного уточняют, все же.

5
ответ дан Community 23 September 2019 в 13:15
поделиться

Как заключение к другим комментариям, не помещайте 'константу' сначала. Это действительно принадлежит после типа. Это сразу разъяснило бы значение, просто считайте его RTL, как обычно:

MyStructure const** ppMyStruct;
3
ответ дан MSalters 23 September 2019 в 13:15
поделиться

Ваш коллега неправ, и это - то же для C и C++. Попробуйте следующее:

typedef struct foo_t {
    int i;
} foo_t;

int main()
{
    foo_t f = {123};
    const foo_t *p = &f;
    const foo_t **pp = &p;
    printf("f.i = %d\n", (*pp)->i);
    (*pp)->i = 888; // error
    p->i = 999;     // error
}

Visual C++ 2008 дает следующие ошибки для последних двух строк:

error C2166: l-value specifies const object
error C2166: l-value specifies const object

GCC 4 говорит:

error: assignment of read-only location '**pp'
error: assignment of read-only location '*p'

G ++ 4 говорит:

error: assignment of data-member 'foo_t::i' in read-only structure
error: assignment of data-member 'foo_t::i' in read-only structure
5
ответ дан csl 23 September 2019 в 13:15
поделиться
void Foo( int       *       ptr,
          int const *       ptrToConst,
          int       * const constPtr,
          int const * const constPtrToConst )
{
    *ptr = 0; // OK: modifies the pointee
    ptr  = 0; // OK: modifies the pointer

    *ptrToConst = 0; // Error! Cannot modify the pointee
    ptrToConst  = 0; // OK: modifies the pointer

    *constPtr = 0; // OK: modifies the pointee
    constPtr  = 0; // Error! Cannot modify the pointer

    *constPtrToConst = 0; // Error! Cannot modify the pointee
    constPtrToConst  = 0; // Error! Cannot modify the pointer
}
0
ответ дан 26 November 2019 в 23:16
поделиться