Почему не берется адрес первого элемента массива?

Есть массив:

char a[2] = { '1','4' };
cout <<&a<<" "<< &a[0] <<" "<<  &a << endl; /вывод:

Почему когда я пишу &a[0] то у меня выводится весь массив,только на конце еще 0?

И еще такой вопрос,почему в функцию RegQueryValueEx мы передаем адрес адреса массива((LPBYTE)&keyData)?Ведь имя массива должно неявно к указателю на этот массив преобразовываться.

   HKEY hKey;
   TCHAR keyData[256] = { 0 };
   DWORD keysize = sizeof(keyData);
   RegQueryValueEx(HKEY_LOCAL_MACHINE, L"Key", NULL, NULL, (LPBYTE)&keyData, &keysize);

P.S.. Давай,stackoverflow,минуси мои вопросы,как всегда,это же проще делать чем помогать новичкам.


Ответы (1 шт):

Автор решения: AR Hovsepyan

Так уж определен оператор std::ostream& operator <<(std::ostream&, const char*); чтобы выводить массив символов так же, как и выводится в С. Поскольку известно, что символьный массив заканчивается символом '\0', то любая функция может определить его конец, поэтому есть смысл сразу выдать массив.

Имя массива используется как указатель на первый элемент, поэтому cout <<a и cout << &a[0] это одно и то же. Но, так как в своем массиве вы не оставили место для '\0', то и получать можете неопределенный результат_будут выводится все байты, пока в памяти не встретится байт с нулевым значением.

LPBYTE это указатель(длинный указатель), а указатели могут содержать только адреса объектов, поэтому нужно передавать адрес, с последующим преобразованием в (LPBYTE), и получается: (LPBYTE)&keyData, но так как keyData имя массива, и передается как указатель, то правильно будет: (LPBYTE)keyData. Другое дело, если функция сама принимает указатель по ссылке...

Пожалуйста, впредь старайтесь в одном вопросе не включать несколько вопросов. Просто оформляйте их как разные вопросы.

→ Ссылка