Программирование на C: указатель на строку двумерного массива? - PullRequest
2 голосов
/ 10 мая 2011

Я написал функцию, которая возвращает указатель на одномерный массив. Прототип функции:

double* NameFunction (int,double*,double*)

Кажется, что функция работает нормально с массивом 1D.

Вот вопрос: я бы хотел использовать функцию для заполнения одной строки двумерного массива.

Как мне написать в вызывающей функции указатель на строку 2D-массива для заполнения?

Могу ли я использовать ту же структуру указателей, чтобы указать строку 2D-массива в качестве аргумента?

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

Да, просто передайте имя 2D-массива с первым заполненным индексом:

NameFunction (12121212,&array[0],some pointer here) // for example if you want to pass the first row
1 голос
/ 10 мая 2011

Переменная, указывающая на массив в C, всегда содержит только адрес, то есть указатель на начало массива. Так что, независимо от типа массива, ему просто нужен указатель *. Так что эта функция должна работать, как сейчас.

Но вам может понадобиться изменить логику программирования.

0 голосов
/ 10 мая 2011

Вы можете принять double foo[20] как массив 1 × 20, или как двумерный массив 4 × 5.Тогда у вас есть координаты, подобные этим:

foo    foo+1  foo+2  foo+3  foo+4
foo+5  foo+6  foo+7  foo+8  foo+9
foo+10 foo+11 foo+12 foo+13 foo+14
foo+15 foo+16 foo+17 foo+18 foo+19

Так что если у вас есть функция, которая возвращает double *, вы можете передать ее (или сделать так, чтобы она возвращалась) foo + 5*n, чтобы указывать на строку n.

#define ROW_LEN 5
#define ROWS 4

void fillRow(double * row)
{
     int i;
     for (i = 0; i < ROW_LEN; i++)
     {
          row[i] = 12;
          (row + i) = 12; // this is the same thing written differently
     }
}

double arr[ROW_LEN * ROWS];
fillRow(arr + 2 * ROW_LEN); // fill third row

Обратите внимание, что C вообще не выполняет никакой проверки диапазона, поэтому, если вы не будете осторожны и случайно с чем-то вроде arr[627] = 553 где-то в вашем коде, он будет слепо перезаписывать все, что находится наВычисляем адрес в памяти.

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