Я просто читаю указатель и адрес массива арифмети c. Но я перепутал - PullRequest
0 голосов
/ 06 января 2020

Не могли бы вы помочь мне понять указатели. Я просто читаю арифметику с указателем и адресом массива c, поэтому я понимаю разницу между увеличением, на которое указывает указатель, и увеличением, на которое указывает указатель, назначением массивов указателям и индексацией. Но я запутался.

Так что в этой книге K & R объясняется, что вы можете изменить указатель, чтобы указать точку в другом месте (я согласен), но результат не определен, если вы назначаете расположение строковой константы для указатель, а затем попытаться изменить содержимое строки. Так как же работает strcpy.

void strcpy(char *s, char *t)
{
    while (*s++ = *t++)
        ;
}

Если s и t являются указателями на адрес массива, то я считаю, что это работает, потому что s и t указывают на массивы, а не на строковые константы, и увеличивают t до s = t! = '\ 0'. Я экспериментировал с указателями здесь, присваивая два массива двум указателям, а затем использовал strcpy

main()
{
    char array123[3] = "123";
    char array4[2] = "44";
    char *stringp1 = array123; 
    char *stringp2 = array4;
    strcpy(stringp1, stringp2);
    printf("%s", stringp1);
}

. Я получил ошибки и сделал снимок ошибок: https://imgur.com/a/tXIKNmZ

Так что я путаю. Мне нужна помощь.

1 Ответ

0 голосов
/ 06 января 2020
char array4[2] = "44";

Здесь array4 содержит массив символов, но не содержит строку.

Почему? Потому что строка определяется как последовательность символов, конец которой отмечен нулевым байтом. Но array4 не имеет места для дополнительного нулевого байта. Поэтому array4 не является строкой.

char *stringp2 = array4;

Хорошо, поэтому stringp2 указывает на array4, массив символов, который не является строкой.

strcpy(stringp1, stringp2);

Нет хорошо. Второй параметр функции strcpy должен быть строкой для копирования.

Вы хотите это:

char array4[3] = "44";

Теперь array4 - строка, поэтому stringp2 указывает на строку и поэтому допустимо передавать в качестве исходного указателя на strcpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...