Как получить доступ к массиву символов по-разному

У меня есть функция, использующая арифметику указателей, чтобы распечатать все символы внутри символа *:

void printCharArray(char* c,int n)
{
    for (char*p=c+n-1; n; n--) 
        cout << *p--;
}

Приведенный выше код работает, но я хочу попробовать другой способ, который не работает:

void printCharArray(char* c,int n)
{
    char *p = &c [n - 1];
    for (int i = 0; i < n; i++)
        cout << *--p;
}

Странное поведение в том, что если я изменю char *p = &c [n - 1]; в char *p = &c [n]; тогда это работает, но я ожидаю &c [n - 1] равен последнему символу в массиве char, но не &c[n]?

1 ответ

Решение

--p; эквивалентно p = p - 1; p;
p--; эквивалентно auto tmp = p; p = p - 1; tmp

другими словами

void printCharArray(char* c,int n)
{
    for (char*p=c+n-1; n; n--) 
        cout << *p--;
}

это покажет *p, *(p - 1),..., *(p - n)

void printCharArray(char* c,int n)
{
    char *p = &c [n - 1];
    for (int i = 0; i < n; i++)
        cout << *--p;
}

это покажет *(p - 1), *(p - 2),..., *(p - (n+1))

Другие вопросы по тегам