Указатели и тип char

Почему в данном коде в указатель s3 записывается значение s4 а не адрес?

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Rus");
//описываем 3 строки, s3- указатель
char s2[20], *s3, s4[30];
cout << "s2="; cin >> s2; //ввод строки s2
cout << "s2=" << s2 << endl;
//запись в s3 адреса строки, где хранится s4. Теперь в переменных
//(указателях) s3 и s4 хранится значение одного и того же адреса
s3 = s4;
cout << "s3="; cin >> s3; //ввод строки s3
//вывод на экран строк s3 и s4, хотя в результате присваивния s3=s4;
//теперь s3 и s4 - это одно и тоже
cout << "s3=" << s3 << endl;
cout << "s4=" << s4 << endl;
system("pause");
}

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

Автор решения: Stanislav Volodarskiy

В указатель s3 записывается именно адрес а не значение. Вас ввёл в заблуждение специальный сервис C++: когда вы пытаетесь напечатать указатель на символ, печатается не сам указатель (адрес памяти), а строка на которую он указывает. Если привести тип указателя к void * будет напечатан именно адрес:

// g++ -std=c++11 -pedantic -Wall -Wextra -Werror print_char_pointer.cpp

#include <iostream>

int main() {
    char buffer[] = "Hello, world!\n";
    char *p = buffer;
    std::cout << buffer;
    std::cout << p;
    std::cout << static_cast<void *>(buffer) << '\n';
    std::cout << static_cast<void *>(p) << '\n';
}
g++ -std=c++11 -pedantic -Wall -Wextra -Werror print_char_pointer.cpp && ./a.out 
Hello, world!
Hello, world!
0x7ffe1861be69
0x7ffe1861be69
→ Ссылка