#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. Другими словами: » Вы не присваиваете массив массиву». 🙂