Pointers
Имам две функции и двете намират дължина на символен низ т.е. правят едно и също. Не мога да разбера какво точно прави while и в двете фукции и по какво се различават.
unsigned int strlen1(const char* str){
int i = -1;
while(str[++i]);
return (unsigned int) i;
}
unsigned int strlen2(const char* str){
const char* s = str;
while(*str++);
return (unsigned int) (str - s - 1);
}
str - s в този случай вади от pointer позицията до която си стигнала pointer-а на началото на стринга. Идеята е, че като стигнеш до null terminator-а, ако извадиш от тази позиция началото, ще получиш дължилата (примерно за {'a', 'b', 'c', '\0'}, ако pointer-а към началото, което е 'a', има стойност 315, тогава поинтер-a към '\0' ще има стойност 318 и съответно 318 - 315 = 3, което е дължината на стринга). Нещо подобно на това споменахме в лекцията, когато говорихме за C-Strings (слайд 35 в тази презентация: https://softuni.bg/trainings/resources/officedocument/13191/presentation-cpp-programming-february-2017)
Допълнителното -1 идва заради начина, по който е написан while-а. Вътре в условието е *str++, което първо ще направи *str и след това ще направи str++. Това е защото a = b++ първо ще сложи a = b, след това ще направи b++ (a = ++b пък първо ще увеличи b, след това ще го сложи на a). Тоест когато стигнеш '\0'-та ще има още едно ++, което ще те прати след нея (в примера с abc, ще стигнем до 318, ще го оценим, че там пише '\0', обаче понеже ++-а се извършва след всичко - ще стигнем на 319 преди да излезем от цикъла).
Btw, най-лесния начин да ги разбереш тези неща е като ги пуснеш тези функции и на всяка стъпка си печаташ на конзолата коя променлива какво пише в нея. Така хем ще си пробвала, хем ще запомниш по-добре - когато нещо ти мине през ръцете се помни много по-добре, отколкото когато само ти отговорят :)
Благодаря ти много! Да, определено това най - много би ми помогнало!