2015-05-23 1 views
1

Как я могу объявить указатель на массив из 3 на 3 и использовать этот указатель для его печати .... Компилятор сообщает об ошибке «[Ошибка ] индексируются значение не является ни массивом, ни указателя, ни вектор "Объявление указателя на массив 3 на 3 и использование указателя для его печати

#include <stdio.h> 
int main(void) 
{ 
    int A[3][3][3]={0}; 

    int *ptr=A; 
    int i,j,k; 
    for(i=0;i<3;i++) 
    { 
     for(j=0;j<3;j++) 
     { 
      for(k=0;k<3;k++) 
      { 
       printf("%d ",*ptr[i][j][k]); 
      } 
      puts(""); 
     } 
    } 
    return 0; 
} 
+1

Это не массив '3' от' 3', это массив 3x3x3, который обычно не полезен ни для чего. –

+0

'int (* ptr) [3] [3] = A;' ... 'printf ("% d ", ptr [i] [j] [k]);' – BLUEPIXY

+0

Не используйте многомерные массивы в C Используйте только 1D массивы, затем 'arr [i * width + j]' и т. Д. –

ответ

3

проблема с кодом является то, что вы объявляете указатель на int и отливку массив к нему. Это неверно, потому что указатель имеет одно неявное «измерение» (и, следовательно, допускает единственное разыменование), в то время как ваш массив имеет три измерения.

Чтобы устранить эту проблему, объявить ptr как указатель на 3 × 3 массива:

int (*ptr)[3][3]=A; 

в этом случае вам нужно удалить оператор разыменования при доступе к элементам массива

printf("%d ", ptr[i][j][k]); 

demo 1.

или указатель на 3 3 массив

int (*ptr)[3][3][3]=&A; 

в этом случае вам необходимо разыменования указателя перед применением индексов к нему:

printf("%d ", (*ptr)[i][j][k]); 

demo 2.

2

Любой многомерный массив фактически одномерный массив элементов из которых в свою очередь, массивы.

Эта декларация

int A[3][3][3]={0}; 

можно переписать следующим образом

typedef int T[3][3]; 

T A[3]; 

Так у вас есть массив A элементы которого имеют тип int[3][3] Если вы хотите, чтобы объявить указатель на первый элемент массива, то вы должны написать

T *ptr = A; 

где ptr является указателем на объекты типа T. Как T является псевдонимом для int[3][3], то предыдущее заявление может быть переписано как

int (*ptr)[3][3] = A; 

В этом случае петли будут выглядеть

for(i=0;i<3;i++) 
    { 
     for(j=0;j<3;j++) 
     { 
      for(k=0;k<3;k++) 
      { 
       printf("%d ", ptr[i][j][k]); 
      } 

     puts(""); 

     } 
    } 

Если вы хотите, чтобы объявить указатель на сам весь массив, то вы можете написать

int (*ptr)[3][3][3] = &A; 

и петли будут выглядеть

for(i=0;i<3;i++) 
    { 
     for(j=0;j<3;j++) 
     { 
      for(k=0;k<3;k++) 
      { 
       printf("%d ", (*ptr)[i][j][k]); 
      } 

     puts(""); 

     } 
    } 

Но я уверен, что в вашем задании вам нужно использовать указатель на первый элемент массива, как я показал изначально.

0

Проблема заключается в том, что доступ к значению указателя с индексом записи работает для одного индекса, если указатель одиночная звезда указатель, как этот

printf("%d\t", ptr[i + 3 * j + 9 * k]); 

А три звезды указателя int ***ptr позволит синтаксис ptr[i][j][k] но это было бы неправильно, потому что указатель указывал бы на указатель указателей int, что означает, что данные упорядочены по-другому, чем у массива int A[3][3][3], массив больше похож на указатель int *ptr, потому что целые числа хранятся смежно.

В подходе int *** он будет похож на массив указателей на массивы указателей int. Это означает, что ptr[i] будет эквивалентен *(ptr + i), которая является таким же, как *((char ***)ptr + sizeof(int **)), так как sizeof(int **) не обязательно совпадают с sizeof(int), то было бы увеличить указатель другой сумму, чем нужно, что приводит к очевидным проблемам, разыменованный указатель не будет указывать на нужное место.

Вы всегда можете указать указатели на массивы, как упоминают другие ответы, но я пропущу эту часть, так как она находится в других ответах.


Это может быть случайно то же самое.

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