Указатель на массивы - PullRequest
1 голос
/ 10 июня 2010

Я использую указатель на массив из 4 целых чисел как int (* ptr) [4]

с использованием следующего кода, в котором m указывает на двумерный массив с использованием этого указателя

int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int (*ptr)[4]= arr[4];

int m= (*ptr)[2];

какое будет значение в "м" ...

мне нужно найти значение элемента arr [1] [2], как я могу получить его, используя указатель ptr?

Ответы [ 3 ]

1 голос
/ 11 июня 2010

Многомерные массивы - это действительно одномерные массивы с небольшим количеством синтаксического сахара. Инициализация для ptr не была адресом. Это должно было быть

int *ptr[4] = { &arr[0][0], &arr[1][0], &arr[2][0], &arr[3][0]};

Вы также можете оставить 4 и просто использовать

int *ptr[] = { &arr[0][0], &arr[1][0], &arr[2][0], &arr[3][0]};

Я внес несколько изменений в ваш код ниже. Обратите внимание на два раздела с printf. Они должны помочь продемонстрировать, как значения на самом деле выкладываются в память.

#define MAJOR 3
#define MINOR 4
int arr[MAJOR][MINOR]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int (*ptr)[4];
int *p = &arr[0][0];

// init ptr to point to starting location in arr
for(i = 0; i < MAJOR; i++) {
    ptr[i] = &arr[i][0];
}

// print out all the values of arr using a single int *
for(i = 0; i < MAJOR * MINOR; i++) {
    printf(" %d", *(p + i) );
}

for(i = 0; i < MAJOR; i++) {
  for(j = 0; j < MINOR; j++) {
     printf( " %d", *(p + i * MAJOR + j) );
  }
  printf("\n");
}
0 голосов
/ 04 ноября 2017

Существует несколько способов доступа к значению элемента arr[1][2].

Метод, используемый в приведенном ниже коде, называется указателем на указатель.Сохраняя адрес первого элемента pa[] в pb, можно использовать pb для доступа к элементам aa[][].Можно использовать обозначение массива aa[1][2] или указатель *((*pb+1)+2).Оба подхода к обозначениям дают эквивалентные результаты.

#include<stdio.h>

int main()
{
 int aa[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
 int *pa[3];

 for(int i=0;i<3;i++)
 pa[i]=aa[i];
 pb=pa;

 printf("pb[1][2]=%d\n",pb[1][2]); /*Array Notation*/
 printf("arr[1][2]=%d",*(*(pb+1)+2)); /*Pointer Notation*/
}
0 голосов
/ 10 июня 2010

Ptr ни на что не указывает и, вероятно, даже не компилируется, поскольку [4] находится за пределами [3] или [4] исходного массива.

Если вынужно найти arr [1] [2], тогда вам нужно int (* ptr) [4] = arr [1];int m = ptr [2];

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