2016-01-30 5 views
6

Я учу об указателях:Указатели 2D массивы C, C++

int x[10]; 
int *p = &x 

это сделало бы тип указателя int на первый элемент. Итак, если у меня есть 2D-массив, мне нужно использовать двойной указатель: первый указатель указывает на второе измерение массива. Это означает:

int x[3][4] = {{1,2,3,4},{5,6,7,8},{9,9,9,9}}; 

и когда я хочу указать на него, я должен объявить размер второго измерения следующим образом, не так ли?

int *p[4] = x; 

или есть другой способ путем ввода: int **p; ?

и int *p[4] - массив целых указателей, который принимает 4 * (sizeof(int*)), правильно?

+1

Просто в стороне: попробуйте избегать указателей alltogether в C++. Используйте 'std :: vector' или' std :: array' вместо массивов в стиле C. – xtofl

+0

«_'int * p [4]' - массив целых указателей, который принимает '4 * (sizeof (int *))', right? _ "- Да. И ** всегда ** компиляция с включенными предупреждениями ('-Wall -Wextra'). Затем вы заметите предупреждения о несовместимых типах указателей при компиляции кода. Таким образом, это даст вам указание, что что-то не так. –

+0

хорошо .. mingw32-g ++. Exe -o ............................ Процесс завершен со статусом 0 (0 минут, 0 секунд) 0 ошибок, 0 предупреждений (0 минут, 0 секунд) и: int x [3] [4] = {{1,2,3,4}, {5,6,7,8 }, {9,987,9,9}}; int (* p) [4] = x; printf ("% d", p [2] [1]); printf ("\ nsize of * p is:% d \ n", sizeof (p)); ------------------------------------------------- ------------- вывод: размер * p есть: 4 –

ответ

8

this would make a pointer type (int) to first element ..

No.
&x является адресом массива x и типа int (*)[10] и вы не можете назначить его int * типа. Оба являются несовместимыми типами.

So, if I had 2D array, I need to use double pointer: first pointer would point to the second dimension of the array.

No.
В выражениях, массивы преобразуются в указатель на его первые элементы, за исключением, когда операнд sizeof и Унарный & оператора. Поэтому в этом случае тип x будет int (*)[4] после преобразования. Вам нужен указатель на массив из 4 int вместо массива 4 указателей

int (*p)[4] = x; 
+0

ну, да ... я указываю, что указатель указывает на целое число .., которое является первым элементом массива x .. и мой вопрос действительно такой: int (* p) [4] = x; это ^^^ 4 указателя (массив указателей) или 1 указатель? –

+0

'in * p [4]' объявляет массив из 4 указателей *. 'p' - массив здесь. – haccks

+0

, то почему sizeof (p) равен 4? он должен быть 16 .. –

3

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

x - это массив из 10 цепей. p - указатель на int, а не указатель на массив из 10 целых чисел. При присвоении p, x распадается на указатель типа на int.

Назначение должно быть просто:

int* p = x; 
-2
// Here is not complicated matrix of size 
int p[2][4]={ 
       {1,2,3,4}, 
       {5,6,7,8} 
      }; 
// points to the first Elements :: ptr 
int (*ptr)[0] = &p; 
// Now have the same adresse (ptr and p) 
printf("Hello world! %d \n",ptr[1][3]); // show 4 
+2

Untitled1.cpp | 35 | error: не может преобразовать 'int (*) [2] [4]' в 'int (*) [0]' при инициализации | –

1

Пример программы:

#include <stdio.h> 
main(int argc, char* argv[]) 
{ 
    int x[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 987, 9, 9 } }; 
    int(*p)[4] = x; printf("p[2][1] %d", p[2][1]); 
    printf("\nsizeof(p) is : %d \nsizeof(*p) is : %d\n", sizeof(p), sizeof(*p)); 
} 

Выход

p[2][1] 987 
sizeof(p) is : 4 
sizeof(*p) is : 16 

В моей системе (как у вас) int и указатели 32 бит. Таким образом, размер указателя равен 4, а размер int равен 4.

p - это указатель в первую очередь. Не массив. Указатель. Это размер 4 не меньше.Это ответ на ваш вопрос

Теперь просто добавить некоторую полезную информацию:

p является указателем на массив из 4-х чисел. Размер p указывает на 4 * 4 == 16. (Попробуйте изменить int к short в примере программы, вы будете иметь sizeof(*p) is : 8)

Я могу назначить p=x, так как тип правильно, теперь p содержит адрес х и р [0] такая же, как х [ 0] (тот же массив из 4 int). p[2][3] - то же, что и x[2][3] и *(p[2]+3). p[2] указывает на элемент 2 x и p[2]+3 указывает на элемент 3 из x[2]. (все индексирование основано на 0)

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