Присвоение части 2d-массива одномерному массиву

#c #multidimensional-array

#c #многомерный массив

Вопрос:

Как мне сделать следующее:

 int A[2][2];
int B[2];
A[1][0]=2;
B=A[1];
printf("%d",B[0]); //prints out 2
  

должен ли я использовать malloc? Я знаю, что на языках более высокого уровня вышеуказанный метод работает, но я немного смущен тем, что делать на C

Комментарии:

1. A[1] — массив с 2 элементами; B — объект другого типа int . Вы не можете назначить массив одной переменной: вы можете назначить элемент массива (того же типа) с B = A[1][0];

2. @pmg oops забыл указать, что B также является массивом, 1D-массивом

3. Что означает ваш комментарий «выводит 2»? Опубликованный вами код не поддается компиляции. Как он может «распечатать» что-нибудь?

4. @AndreyT обратите внимание, что это не функциональный код, скорее псевдокод. B=A[1] устанавливает массив B равным 1d-массиву A[1]. A [1] [0] = 2, поэтому B [0] = 2

Ответ №1:

Вы не можете присваивать массивы (хотя вы можете их инициализировать, что сильно отличается).

Вы можете делать то, что хотите, присваивая B поэлементно

 B[0] = A[1][0];
B[1] = A[1][1];
  

или с помощью цикла

 for (k=0; k<2; k  ) B[k] = A[1][k];
  

Комментарии:

1. существуют ли более эффективные способы сделать это? зацикливание элемента за элементом кажется немного неэффективным.

2. Компилятор должен оптимизировать его для вас… но вы можете попробовать memmove или memcpy : memmove(B, A, sizeof B); . Не забудьте #include <string.h> .

Ответ №2:

Проблема здесь в том, что переменная объявлена как int B , когда вы должны объявить ее как int B[2] .

В вашем коде, когда вы присваиваете A[1] to B , он присваивает значение первого элемента A[1] to B

Вы можете объявить as int *B , поэтому вы назначите ptr A[1] to B . Как бы то ни было, в зависимости от компилятора не будет компилироваться. Для тестирования выполните:

 int *B;
B = A[1];
printf("%d, %d", B[0], B[1]);
  

Комментарии:

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

2. Выше у вас будет ссылка на A, таким образом, изменяя B, A также изменяется.

Ответ №3:

Вы могли бы использовать memcpy().

 #include <stdio.h>
#include <string.h>

int main() {
  int a[2][2] = {{1, 2}, {3, 4}};
  int b[2];

  // Syntax: memcpy(to, from, number_of_bytes_to_copy);
  // (to and from should be pointers)
  memcpy(b, a[1], sizeof(int) * 2);

  printf("%d %d", b[0], b[1]);
}
  

Вывод:

 3 4
  

Ответ №4:

Массивы не могут быть назначены. Вы не можете назначить весь массив. Будь то 2D, 1D или 42D, здесь вообще нет никакой разницы.

Использование memcpy

 static_assert(sizeof B == sizeof A[1]);
memcpy(B, A[1], sizeof B);
  

напишите свою собственную функцию копирования массива или используйте макрос

 #define ARR_COPY(d, s, n) do{
    size_t i_, n_; for (i_ = 0, n_ = (n); i_ < n_;   i_) (d)[i_] = (s)[i_];
  }while(0)

ARR_COPY(B, A[1], 2);
  

Комментарии:

1. Другими словами: » Вы не присваиваете массив массиву». 🙂