2015-01-22 4 views
1

Когда я создаю массив целых указателей, я пробовал это.Объявление массива указателей в C++

int *arr = new int*[10]; 

Это не сработало, но следующие работы.

int **arr = new int*[10]; 

Зачем нам нужен двойной указатель ?? И когда я его уважал, я должен был сделать следующее.

cout<<arr[0]; 

Зачем нам не нужно * перед arr ?? спасибо!

+0

Что это за «это не сработало»? Каково ваше определение «это сработало»? Используйте точный язык, пожалуйста. Мы здесь ученые. –

+0

«int *» указывает на 'int' или первый элемент массива' int'. Если вы хотите указывать на 'int *', а не на 'int', вам нужно' int ** '(указатель на int указатель или на первый элемент массива int указателей). – Galik

+0

«Мне нужно было сделать следующее». - О'рли? –

ответ

3

new int*[10] выделяет массив из десяти указатели, и он дает указатель на первый элемент этого массива. Тип элемента - это сам указатель, поэтому у вас есть указатель на указатель (до int), который составляет int**. И, очевидно, int** не конвертируется в int*, поэтому вам необходимо объявить arr с соответствующим типом.

1

Вы не просто «создаете массив целых указателей»: вы динамически выделяете их.

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

int* ptr = new int[5]; 

когда вы динамически выделять массив указателей-на-целое число вы получите один указатель через которые также могут получить доступ к ним; так как ваш тип элемента int*, добавив дополнительный * дает int**:

int** ptr = new int*[5]; 

Что касается разыменования, я не совсем уверен, что вы просите, но это только, как работает оператор []; он добавляет n к указателю, то разыменовывает это:

int* ptr = new int[5]; 
*(ptr+1) = 42;   // identical 
    ptr[1] = 42;   // to this 

Если вы забыли динамическое выделение и просто сделать хороший массив, все гораздо проще:

int* array[5]; 
std::cout << array[0]; 
0

Это утверждение является выражение для 1D массив Int

int* arr = new int [10]; // pointer to array of 10 int 

Это утверждение является выражение для 2D массив Int

int** arr = new int* [10]; // pointer to 10 pointers to arrays of 10 int 

Чтобы заселить массив 1D, что вам нужно сделать это ...

for (int i = 0; i < 10; i++) { 
     arr[i] = val; // where val can be any integer 
} 

чтобы заполнить 2D массив, вам нужно сделать, это ...

int** arr2 = new int*[10]; 
for (int i = 0; i < 10; i++) { 
    arr2[i] = new int[10]; 
    for (int j = 0; j < 10; j++) { 
     arr2[i][j] = val; // where val can be any integer 
    } 
} 

Символ * между типом переменной и именем переменной является синтаксисом для указателя.Он меняет тип от int до Указатель int.

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