C объявление массива и присвоение?

Это должно сделать это.

const createdData = {
subject: '1',
date: '2',
header: '3',
message: '4'
}

const string = JSON.stringify(createdData)
const escapedString = JSON.stringify(string)
15
задан Community 23 May 2017 в 12:25
поделиться

5 ответов

Проще говоря, массивы нельзя назначать. Они являются «немодифицируемым значением». Это, конечно, вызывает вопрос: почему? Пожалуйста, обратитесь к этому вопросу для получения дополнительной информации:

Почему C ++ поддерживает членское присвоение массивов внутри структур, но не в целом?

Массивы не являются указателями. x здесь делает ссылаются на массив, хотя во многих случаях это "разлагается" (неявно преобразуется) в указатель на его первый элемент. Аналогично, y также является именем массива, а не указателем.

Вы можете назначать массивы внутри структур:

struct data {
    int arr[10];
};

struct data x = {/* blah */};
struct data y;
y = x;

Но вы не можете делать это напрямую с массивами. Используйте memcpy .

24
ответ дан 1 December 2019 в 01:53
поделиться

В некоторых сообщениях здесь говорится, что имя массива дает адрес его первого элемента. Это не всегда так:

#include <stdio.h>

int
main(void)
{
  int array[10];

  /*
   * Print the size of the whole array then the size of a pointer to the
   * first element.
   */
  printf("%u %u\n", (unsigned int)sizeof array, (unsigned int)sizeof &array[0]);

  /*
   * You can take the address of array, which gives you a pointer to the whole
   * array. The difference between ``pointer to array'' and ``pointer to the
   * first element of the array'' matters when you're doing pointer arithmetic.
   */
  printf("%p %p\n", (void*)(&array + 1), (void*)(array + 1));

  return 0;
}

Вывод:

40 4
0xbfbf2ca4 0xbfbf2c80
2
ответ дан 1 December 2019 в 01:53
поделиться

Чтобы назначить массивы, вам нужно будет присвоить значения внутри массива.

т.е. x = y эквивалентно

for(int i = 0; i < 10 < ++i)
{
x[i] = y[i];
}
1
ответ дан 1 December 2019 в 01:53
поделиться

Когда говорят, что «int x [10]» говорит «зарезервируйте место для 10 целых чисел и передайте мне указатель» к месту ". Таким образом, чтобы копия имела смысл, вам нужно работать с памятью, на которую указывает, а не с «именем ячейки памяти».

Так что для копирования вы бы использовали цикл for или memcpy ().

0
ответ дан 1 December 2019 в 01:53
поделиться

Я использовал компиляторы C, где это прекрасно скомпилировалось бы ... и при запуске кода получилось бы x point к массиву y.

Вы видите, в C имя массива является указателем, который указывает на начало массива. Фактически, массивы и указатели по существу взаимозаменяемы. Вы можете взять любой указатель и индексировать его как массив.

В те времена, когда C разрабатывался в начале 70-х годов, он предназначался для относительно небольших программ, которые были чуть выше ассемблера в абстракции. В этой среде было чертовски удобно иметь возможность легко переключаться между индексированием массива и математикой указателя. С другой стороны, копирование целых массивов данных было очень дорогим делом, и вряд ли что-то поощрялось или отвлекалось от пользователя.

Да, в наше время было бы более разумно, чтобы имя массива было сокращенным для «всего массива», а не для «указателя на начало массива». Тем не менее, C не был разработан в эти современные времена. Если вы хотите язык, который был, попробуйте Ада. x: = y делает именно то, что вы ожидаете; он копирует содержимое одного массива в другой.

0
ответ дан 1 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: