Ссылка на переменную в существующем массиве - PullRequest
2 голосов
/ 08 апреля 2020

Я довольно новичок в C и начинаю играть с указателями. Я не нашел способ назначить массив для нескольких переменных. В идеале я хочу:

char myArray[10] = "test";
char (*p)[10] = &myArray;
char anotherArray[10];
anotherArray = *p;

Это не работает, и я не знаю почему. Я нашел способ «скопировать» массив, используя for для l oop,

for (int i = 0; i < 10; i++)
{
   anotherArray[i] = myArray[i];
}

. Я не знаю, является ли это хорошей практикой, и есть ли более простой способ.

Содержание массива не должно изменяться, поэтому я просто хочу иметь простой способ сделать это:

firstArr[size] = "content";
secondArr = firstArr;

Ответы [ 2 ]

4 голосов
/ 08 апреля 2020

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

Массивы обычно копируются с memcpy. В случае, если они являются строками, вы также можете использовать strcpy, который копирует до тех пор, пока не найдет нулевой терминатор строки.

В вашем примере это будет strcpy(anotherArray, *p);. Но использование указателя массива типа char (*)[10] является немного странной практикой, гораздо чаще использовать указатель на первый элемент массива. Я бы порекомендовал вам изменить свой код на это:

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

int main(void) 
{
  char input[10] = "test";
  char* p = input;
  char anotherArray[10];

  strcpy(anotherArray, p);
  puts(anotherArray);
}
0 голосов
/ 08 апреля 2020

Вы не можете назначить массив нескольким переменным, но вы можете назначить несколько переменных, чтобы указывать на массив.

Все указатели - это память и память, на которую они указывают .

Такие операторы присваивают переменной myArray фиксированный объем памяти (байты памяти размером 10 char) и инициализируют содержимое, содержащее «test1».

char myArray[10] = "test1";

По определению myArray фактически является указателем на первую ячейку памяти, которая в этом случае содержит символ со значением 't', но он фиксируется в этой памяти.

Вы можете определить другой указатель для типа char и присвоить ему то же значение, что и указатель на память, в которой хранятся данные "test1" - таким образом:

char *secondPtr = myArray;

Теперь secondPtr и myArray оба указывают на та же память, которая содержит "test1". Существует не две копии данных, но это может выглядеть так, если вы сделали

printf("myArray %s", myArray);
printf("secondPtr %s", secondPtr);

Теперь вы можете использовать либо myArray, либо secondPtr для изменения тех же данных, поэтому указатели должны относиться с осторожностью.

Теперь, поскольку secondPtr - это просто указатель на символ и поэтому он не фиксируется так же, как myArray, вы можете сделать это:

char myArray2[10] = "test2";
secondPtr = myArray;
printf("secondPtr %s", secondPtr);

secondPtr = myArray2;
printf("secondPtr %s", secondPtr);

Чтобы скопировать данные из одного массива в другой вы можете использовать memcpy, который будет копировать определенное количество байтов (октетов) памяти из одного места в другое.

Тот же процесс выполняется al oop (это основа * Код 1043 *, но на самом деле это не лучший способ его выполнения, поскольку нет проверки ни размера массивов, ни количества l oop итераций), например

for(int i=0; i<10; i++)
{
  myArray2[i] = myArray[i];
}

, это также может быть:

secondPtr = myArray2;
for(int i=0; i<10; i++)
{
  myArray2[i] = secondPtr +i;
}
...