Подтвердить что ты не робот

Можно ли преобразовать char [] в char * в C?

Я выполняю задание, где мы должны прочитать последовательность строк из файла в массив. Я должен вызвать алгоритм шифрования в массиве (шифр переносит 2D-массивы). Итак, сначала я помещал всю информацию из файла в 2D-массив, но у меня было много проблем с конфликтующими типами в остальной части моего кода (в частности, попытка установить char [] на char *). Итак, я решил переключиться на массив указателей, что сделало все намного проще в большинстве моих кодов.

Но теперь мне нужно преобразовать char * в char [] и обратно, но я не могу понять это. Я не смог найти что-либо в Google. Я начинаю задаваться вопросом, возможно ли это.

4b9b3361

Ответ 1

Похоже, вы путаетесь между указателями и массивами. Указатели и массивы (в данном случае char * и char []) не то же самое.

  • В массиве char a[SIZE] указано, что значение в месте a представляет собой массив длиной SIZE
  • Указатель char *a; говорит, что значение в местоположении a является указателем на char. Это может быть объединено с арифметикой указателя, чтобы вести себя как массив (например, a[10] - 10 записей, где бы ни были a).

В памяти это выглядит так (пример из FAQ):

 char a[] = "hello";  // array

   +---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
   +---+---+---+---+---+---+

 char *p = "world"; // pointer

   +-----+     +---+---+---+---+---+---+
p: |  *======> | w | o | r | l | d |\0 |
   +-----+     +---+---+---+---+---+---+

Легко смутить разницу между указателями и массивами, потому что во многих случаях ссылка на массив "распадается" на указатель на первый элемент. Это означает, что во многих случаях (например, когда передается вызов функции) массивы становятся указателями. Если вы хотите узнать больше, в этом разделе часто задаваемых вопросов см. Раздел "Частые вопросы" .

Одно важное практическое отличие заключается в том, что компилятор знает, как долго будет массив. Используя приведенные выше примеры:

char a[] = "hello";  
char *p =  "world";  

sizeof(a); // 6 - one byte for each character in the string,
           // one for the '\0' terminator
sizeof(p); // whatever the size of the pointer is
           // probably 4 or 8 on most machines (depending on whether it a 
           // 32 or 64 bit machine)

Не видя своего кода, трудно рекомендовать лучший курс действий, но я подозреваю, что изменение использования указателей во всем мире решит проблемы, которые у вас есть. Обратите внимание, что теперь:

  • Вам нужно будет инициализировать память везде, где раньше были массивы. Например, char a[10]; станет char *a = malloc(10 * sizeof(char));, а затем проверит, что a != NULL. Обратите внимание, что в этом случае вам действительно не нужно говорить sizeof(char), потому что sizeof(char) определяется как 1. Я оставил его для полноты.

  • В любом случае, когда вы ранее имели sizeof(a) для длины массива, нужно было бы заменить длину выделенной памяти (если вы используете строки, вы можете использовать strlen(), который рассчитывает до '\0').

  • Вам потребуется сделать соответствующий вызов free() для каждого вызова malloc(). Это говорит компьютеру, что вы сделали, используя память, которую вы просили, с помощью malloc(). Если ваш указатель a, просто напишите free(a); в точке кода, где вы знаете, что вам больше не нужно, что a указывает на.

Как уже указывалось в другом ответе, если вы хотите получить адрес начала массива, вы можете использовать:

char* p = &a[0] 

Вы можете прочитать это как "char pointer p становится адресом элемента [0] of a".

Ответ 2

Если у вас есть char[] c то вы можете сделать char* d = &c[0] и элемент доступа c [1], выполнив *(d+1) и т.д.

Ответ 3

Вам не нужно объявлять их как массивы, если вы хотите использовать их в качестве указателей. Вы можете просто ссылаться на указатели, как если бы они были многомерными массивами. Просто создайте его как указатель на указатель и используйте malloc:

int i;
int M=30, N=25;
int ** buf;
buf = (int**) malloc(M * sizeof(int*));
for(i=0;i<M;i++)
    buf[i] = (int*) malloc(N * sizeof(int));

а затем вы можете ссылаться на buf[3][5] или что-то еще.

Ответ 4

Ну, я не уверен, чтобы понять ваш вопрос...

В C, Char [] и Char * - одно и то же.

Изменить: спасибо за эту интересную ссылку.