#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. @Питер, ты прав, я не видел отсутствующего разыменования. Я исправил свой ответ.