Передача двумерного массива в функцию - PullRequest
0 голосов
/ 30 декабря 2011

Следующий код работает частично.Пожалуйста, помогите определить ошибку1007 * В приведенном выше коде -

 show ( a, 3, 4 ) ; Through this statement I am passing 'a'. In this case 'a' contains the address of first subarray a[0]. This a[0] address in stored in (*q)[4].

 In show() since q contains a[0] address i am looping through and printing all elements in first sub array (i.e) 1,2,3,4

 In show() again using statement q++, the value of q is changed to point to a[1] (i.e) second sub-array. Then through looping all the elements in 2nd subarray are printed. This process continues.

Здесь 'a' имя двумерного массива хранит 'a [0]' адрес первого суб-массива.

a [0]first sub array хранит адрес первого элемента [0] [0] и так далее.

Вопрос:

  1. Когда создается мой 2D-массив, для этих 'a', 'a [0]', 'a [1]', 'выделяется пространствоa [2] ',' a [3] 'Не так ли?Помимо пространства, выделенного для [0] [0], a [0] [1], a [1] [0] ...... a [3] [4]

  2. Почему я не могу получить адрес «а» и «а [0]», «а [1]», «а [2]», «а [3]».Всякий раз, когда & ассоциируется с ними, я получаю адрес a [0] [0], a [1] [0], a [2] [0]

Ответы [ 4 ]

4 голосов
/ 30 декабря 2011

Ошибка здесь:

q=q+i;

Это сначала увеличивает q на ноль, затем на один, затем на два, заставляя его пропустить третий элемент и перейти прямо к четвертому (и в вашем случаеэто индексирует за концом массива, давая значения барахла).

Вам нужно увеличивать на единицу каждый раз q++;, и вам нужно будет поместить это в конец цикла.Кроме того, вы можете полностью удалить эту строку и использовать вместо этого:

for (j = 0; j < col; j++) {
    printf("%d ", q[i][j]);
}
2 голосов
/ 30 декабря 2011

Почему бы не использовать что-то простое:

void show ( int q[][4], int row )
{
  int i, j ;
  for ( i = 0 ; i < row ; i++ )
  {
    /* We already know there are four "columns", no need for a parameter */
    for ( j = 0 ; j < 4 ; j++ )
      printf ( "%d ", q[i][j] ) ;
    printf ( "\n" ) ;
  }
  printf ( "\n" ) ;
}
0 голосов
/ 11 июня 2013

Попробуйте это.В приведенном ниже коде это просто взять указатель и назначить в нем адрес, и распечатать в соответствии с этим. Потому что этот адрес содержит адрес базового адреса массива q+i и после этого он увеличивается от смещения.

int i, j;
int *p;
for (i = 0; i < row; i++) {
    p = q + i;
    for (j = 0; j < col; j++) {
        printf("%d ", *(p + j));
    }
    printf("\n");
}
0 голосов
/ 30 декабря 2011
q=q+i;

Давайте проследим, что происходит с q каждый раз в цикле.

  1. Когда i == 0, q имеет исходное значение.

  2. Когда i == 1, мы добавляем 1 к q.

  3. Когда i == 2 (последняя строка), мы добавляем 2 кq.Однако мы уже добавили 1 в предыдущей итерации.Так что теперь q на 3 больше, чем было в начале, и, таким образом, указывает сразу за концом массива.Когда мы разыменовываем этот указатель, мы получаем неопределенное поведение.

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