Разница между int * i и int ** i - PullRequest
       12

Разница между int * i и int ** i

8 голосов
/ 25 сентября 2010

В чем разница между int* i и int** i?

Ответы [ 12 ]

0 голосов
/ 26 сентября 2010

Подстановка текста здесь полезна, но остерегайтесь использовать ее вслепую, поскольку она может ввести вас в заблуждение (как в расширенном примере ниже).

T var; // var has type T
T* var; // var has type "pointer to T"

Это работает независимо от того, что такое T:

int* var; // pointer to int
char* var; // pointer to char
double* var; // pointer to double

// advanced (and not pure textual substitution):
typedef int int3[3]; // confusing: int3 has type "array (of size 3) of ints"
                     // also known as "int[3]"
int3* var; // pointer to "array (of size 3) of ints"
           // aka "pointer to int[3]"

int (*var)[3]; // same as above, note how the array type from the typedef
               // gets "unwrapped" around the declaration, using parens
               // because [] has higher precedence than *
               // ("int* var[3];" is an array (size 3) of pointers to int)

Это работает, когда T сам является указателем типа:

typedef int* T; // T is a synonym for "pointer to int"
T* var; // pointer to T
        // which means pointer to pointer to int
// same as:
int** var;
0 голосов
/ 25 сентября 2010

Обратите внимание, что

int *i

не полностью взаимозаменяемы с

int i[]

Это можно увидеть в том, что скомпилируется следующее:

int *i = new int[5];

во время этогоне будет:

int i[] = new int[5];

Во-вторых, вы должны дать ему список конструкторов:

int i[] = {5,2,1,6,3};

Вы также можете проверить с помощью формы []:

    int *i = new int[5];
    int *j = &(i[1]);
    delete j;

компилирует предупреждение бесплатно, а:

    int i[] = {0,1,2,3,4};
    int j[] = {i[1]};
    delete j;

выдаст предупреждения:

предупреждение C4156: удаление выражения массива без использования формы массива «delete»;предупреждение о замене массива C4154: удаление выражения массива;преобразование в предоставленный указатель

В обоих последних двух примерах произойдет сбой приложения, но вторая версия (с использованием типа объявления []) выдаст предупреждение о том, что вы стреляете себе в ногу.

(Win32 консольный проект C ++, Visual studio 2010)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...