Czy taki zapis poprawny?-Wskaźniki

0

Od jakiegoś czasu gdy przykładowo mam jakiś napis w char napis[999] , gdy chcę go przeszukać żeby znaleźć np. spacje czy jeszcze jakieś inne rzeczy na w/w napisie stosuje zapis:

for(i=0; *(napis+i)!='\0'; ++i)
{
...blablabla
}

jednak często spotykam się z zapisem

while(*(napis++)!='\0')
{
...blablabla
}

Dlatego się pytam, czy ma to jakąś różnicę? Pytam bo jestem początkującym,a nie chciałbym jakiś złych nawyków mieć.

0

Opcja 2 moze być szybsza jeśli nie ma jakiejś optymalizacji włączonej. Bo zauważ ze opcja pierwsza zawsze robi tak:
wczytaj pozycje wskaźnika napis, wylicz pozycję napis+i odwołaj się do tej pozycji,
a opcja druga robi po prostu:
wczytaj wartość znajdujacą sie pod wskaźnikiem napis

A realnie to niewielka różnica, przy czym tak na prawdę to najbardziej human-readable byłoby po prostu:

for(int i=0;i<strlen(napis);i++){

}
0

wszystko jet poprawnie, z tym że zapis:
*(napis+i)
jest dokładnie tym samym co:
napis[i]
lub też:
i[napis]
Można jednak uprościć porównania:

for(i=0;napis[i];++i) ...
while(*(napis++)) ...
for(char *i=napis;*i,++i) ...

różnica jest, w nawiasach klamrowych while wskaźnik napis jest ustawiony zawsze na kolejny znak, ale można to zamienić na:
while(*napis) { ... ++napis; }
wtedy będzie to samo.

0

W działaniu nie ma, jednak w pierwszym wypadku masz dodatkowo zadeklarowany licznik, który możesz sobie gdzieś wykorzystać. Druga różnica polega na długości zapisu. Jednak przy pętli for deklarowana masz dodatkową zmienną, która jest inkrementowana, w while'u inkrementujesz bezpośrednio wskaźnik czyli nie używasz dodatkowej zmiennej. Nie wiem natomiast czy w pierwszym przypadku, gdy nie wykorzystujesz nigdzie lokalnej zmiennej (będącej licznikiem pętli) kompilator nie zoptymalizuje tego...

1 użytkowników online, w tym zalogowanych: 0, gości: 1