argv to _tablica wskaźników_ na C-stringi. Pierwszy element to relatywna ścieżka do wykonywanego programu(od aktualnej), reszta - parametry. To co robisz przy pierwszym cout-ie to pobranie ścieżki(el. nr 1) i dereferencja wskaźnika, a jako iż wskaźnik to char* więc dostajesz pierwszy znak w tym c-stringu. Za drugim razem nie robisz dereferencji więc cout wyświetla cały c-string.
Operacje na wskaźnikach i c-stringach się kłaniają.
Zacznijmy od tego, że argv to tablica wskaźników do pokazywania na obiekty typu char.
Wysłanie do strumienia cout adresu takiego wskaźnika powoduje zawsze wypisywanie znaków alfanumerycznych, aż do napotkania nulla.
Ale np. argv[2] to 3-ci wskaźnik. Wskaźnik ten pokazuje na początek C-stringu (C-string jest tutaj nazwą parametru przekazanego do programu), czyli na jego zerowy element. * to dereferencja czyli po prostu wyświetlenie tego zerowego elementu.
W przypadku warunków, to pierwszy jest spełniony ponieważ w klasie string istnieje przeładowany operator ==. Natomiast do samych C-stringów tego operatora użyć nie można.
argv[index] → to tzw. C-string (czyli wskaźnik na ciąg znaków zakończony znakiem NULL)
Pisząc *argv[index] odwołujesz się do pierwszego znaku tego napisu. Analogicznie:
const char *napis = "Napis";
printf("%s", napis); // cały napis
printf("%c", *napis); // pojedynczy znak
Tak jak już wspomniałem, argv[index] to wskaźnik. Pisząc argv[0] == “D:\c++\start.exe” porównujesz dwa wskaźniki (nie to, na co wskazują). Jeśli chciałbyś porównywać C-stringi, użyj funkcji strcmp. Natomiast typ std::string “potrafi się porównać” z C-stringiem, więc działa tak jak chcesz.
Pierwszy parametr jest zawsze ścieżką z nazwą programu,albo nazwą samego programu,jest to tablica wskażników do parametrów dlatego wywołuje się z gwiazdką,gdy posługujemy się wskażnikami,potrzebujemy adresów,stąd konieczność stosowania uppersandu &,adresy są wyłuskiwane i przypisywane do wskażników,podobnie są adresowane tablice tab[3] to tak naprawdę *(tab+3)