Требуется объяснение арифметики указателей с массивом указателей на строковые литералы - PullRequest
0 голосов
/ 02 февраля 2019

Я сейчас пытаюсь выучить C, с некоторым предыдущим опытом работы с Python, и арифметика указателей действительно смущает меня прямо сейчас.

#include <stdio.h>


int main()
{
    char *s[] = {"String1", "Literal2", "Pointers3"}; 
    printf("%c", s[1]+1);
    return 0;
}

Почему он печатает m вместо i?

Когда я заменяю строку формата на %s, она делает то, что ожидала, и печатает iteral2 (перейдите к 0-му индексу 1-го строкового литерала, затем переместите 1 адрес памяти вперед и выведите остальную часть).

Как это работает, почему он печатает, казалось бы, произвольный символ вместо 1-го (или 1-го?) Индекса, когда я использую строку формата %c.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019
#include <stdio.h>

int main() {
const char *s[] = {"String1", "Literal2", "Pointers3"}; 
printf("%c", s[1][1]);
return 0; }

Также я думаю, что вы должны сделать s [] постоянным, так как он устарел.

0 голосов
/ 02 февраля 2019

Спецификатор формата %c ожидает символ, а не указатель на символ.Выражение s[1] вычисляет указатель на символ, указывающий на «Literal2», а выражение s[1]+1 также оценивает указатель на символ, указывающий на «iteral2».

Итак, выПередав printf() указатель на символ, вы указываете ему напечатать символ.Итак, происходит то, что указатель интерпретируется как символ, а вывод - мусор.

Если вы вставляете символ в «String1», (делая его, скажем, «String11»,) тогда все будет перемещаться вверх в памяти на одну позицию, поэтому значение указателя будет больше на 1, и поэтому он может вывести n вместо m.

Для получения символа,когда у вас есть только указатель на символ, вам нужно разыменовать указатель.Итак, это было бы "%c", *(s[1]+1).

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