как адресуются адреса указателей?

#c #pointers

#c #указатели

Вопрос:

Я наткнулся на тест с использованием языка C, относящийся к указателям, но я не знаю, получил ли я правильные или неправильные ответы. Дается следующий код и выясняется результат. Кстати, адрес для переменной a, p, q, r рассматривается как 500, 600, 700, 800 .

 int main(void)
{
   int  a = 10, *p = amp;a, **q = amp;p, ***r = amp;q;
   printf("%u %u %u %u %u", amp;a, p, q, r, *r);
  
   return 0;
}
  

Я думал, что p указывает на адрес a, q указывает на адрес p, а r указывает на адрес q. Следовательно, amp;a равно p и q равно *r .

Поэтому я предположил, что результаты будут 500 500 600 700 600 .

Будет ли это правильным ответом?

Комментарии:

1. Вы не должны использовать %u для печати указателей. Вместо этого используйте %p . Включите предупреждения компилятора

Ответ №1:

если p содержит адрес a, то p = 500, снова q содержит адрес p, поэтому q = 600, r содержит адрес q, поэтому r = 700, и *r=600..so окончательный ans равен 500,500,600,700,600. это означает, что ваше предположение абсолютно верно.

Комментарии:

1. Спасибо за ответ. Еще одна вещь, если printf("%u %u %u %u %u", amp;a 1, p 1, q 1, r 1, *r 1); бы я тогда должен был добавлять 4 к каждому адресу, поскольку адрес занимает 4 байта памяти? Результаты будут 504 504 604 704 604 ?

2. @Learner_15 Это может произойти, но это вызовет неопределенное поведение, поэтому результат не будет определенным

3. @klutt хм .. так что я думаю, просто взглянув на это с точки зрения новичка, где я просто изучаю указатели, это должен быть правильный ответ, который ищет тест.

4. Арифметика указателей учитывает размер объектов, поэтому она зависит от размера int вашего текущего компьютера. Почему бы вам просто не попробовать printf("%p %p", amp;a, amp;a 1) и не убедиться самому?

5. ваш ответ right..it было бы 504,504,604,704,604.