Александр,
Я бы тоже привязывал звезду к int (т.е. int* p), но в Си есть противная синтаксическая фишка: указатели привязываются к переменной, а не к типу. Стандартная детская ошибка…
Александр, Си++17, кстати, начал отходить от Си-строк — пока простеньким типом string_view, который состоит из указателя и длины, строкой не владеет и не гарантирует нуля в конце.
Александр, Поскольку этот самый (const) char* часто используется как указатель на Си-строку, функции вывода для int*, void* и прочих выводят машинное значение указателя, а для char* — строку под указателем. А если под указателем не строка, а непонятно что — с риском access violation. Так что лучше говорить не «i = "asd"», а «i указывает на эту самую строку».
Александр,
Насчёт i == "asd" — не совсем так.
i указывает на строку "asd", и только от реализации зависит, будет ли true условие i == "asd". Потому что сравниваться будут указатели, и будут ли склеены два строковых литерала в один — зависит от реализации.
Ну и, разумеется, они равны как строки. std::string(i) == "asd", strcmp(i, "asd") == 0.