Может ли кто-нибудь сказать, что печатается в этом вопросе?

#c #arrays #pointers

Вопрос:

 #include <iostream>

using namespace std;
const int MAX = 4;

int main () {
const char *names[MAX] = { "Zara Ali", "Hina Ali", "Nuha Ali", "Sara Ali" };

   for (int i = 0; i < MAX; i  ) {
      cout << "Value of names[" << i << "] = ";
      cout << (names   i) << endl;
   }

return 0;
}
 

что такое (имена i) печать в приведенном выше коде

что такое имена символов *

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

1. У вас есть какие-нибудь предположения относительно того, что это такое?

2. Вы пробовали пройти через код шаг за шагом ?

Ответ №1:

names представляет собой массив const char * указателей, которые инициализируются для указания на строковые литералы в памяти (что не имеет отношения к отображаемому коду).

Когда на массив ссылаются только по его имени, он распадается на указатель на первый элемент. Затем цикл использует арифметику указателя для увеличения этого указателя для доступа к каждому последующему элементу. Таким образом, выражение names i фактически совпадает с amp;names[i] , и поэтому цикл выводит адрес памяти каждого элемента в массиве, например:

 Value of names[0] = 0x7ffedc2f1850
Value of names[1] = 0x7ffedc2f1858
Value of names[2] = 0x7ffedc2f1860
Value of names[3] = 0x7ffedc2f1868
 

Онлайн-демонстрация

Если бы *(names i) вместо этого использовался код, то он разыменовал бы эти адреса, тем самым распечатав каждый const char* указатель в массиве. operator<< перегружен для обработки const char* в виде строки, заканчивающейся нулем, поэтому содержимое строковых литералов будет печататься вместо их адресов, например:

 Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali
 

Онлайн-демонстрация

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

1. Это неверно. То, что вы описываете, было бы правдой, если *(names i) бы было напечатано. Звездочка отсутствует. names i является указателем на указатель, а не указателем на первый символ строки.

2. @Питер, ты прав, я не видел отсутствующего разыменования. Я исправил свой ответ.