leech10 --> na razie bardzo daleko jesteś od mikrokontrolera i pewnie stąd to niezrozumienie .... tym bardziej, że posługujesz się w rozważaniach na razie takimi funkcjami jak scanf(), printf() .... których (jak sam zresztą piszesz) działania w ogóle nie rozumiesz
A tymczasem gdybyś przeczytał sobie np rozdział 4.8 WSKAŹNIKI, str 153 z bluebooka, (dokładniej na stronie 155) ... to już miałbyś wizję co to jest adres zmiennej. Tymczasem w programowaniu na PC nikogo nie interesuje taki adres bo po co ? Nie ma tego w rozważaniach w książkach do C na PC ... i stąd masz kłopoty.
Piszesz np:
leech10 napisał(a):
hodzi mi o to co tak naprawde robi funkcja scanf("%d" , &a). czy ona zapisuje liczbę podana przy wpisywaniu jako adres?
No pewnie w tej książce masz wyraźnie napisane że funkcja ta służy do wprowadzania danych ze strumienia zewnętrznego. Więc jak możesz pytać czy ona zapisuje liczbę jako adres ? A co to znaczy zapisać liczbę jako adres hmmm ?
masz swoją zmienną "a" typu int. Rzuć proszę okiem w tym momencie na stronę 153 w bluebooku, i ona jest umieszczona w pamięci RAM pod jakimś adresem - TO ZNACZY w jakiejś komórce pamięci RAM, a komórki te ponumerowane są przecież. I ten numer komórki panie kochany to jest fizyczny adres zmiennej w pamięci RAM. Tyle że ty już z tej książki nabierasz nawyku posługiwania się najmniejszym typem int
podczas gdy w prockach zaczniesz szybko mieć z tym kłopoty bo to AŻ DWA bajty w procku - więc ta twoja zmienna "a" w procku zajęłaby aż dwa bajty.
leech10 napisał(a):
to czy np wartosc zmiennej globalnej a bedzie rowna 0,
Ja w książce wyraźnie piszę i to MUSISZ sobie zapamiętać na zawsze - że w języku C WSZYSTKIE ZMIENNE GLOBALNE są automatycznie inicjowane ZEREM jeśli ich nie inicjalizujesz inną wartością. Rozumiesz?
leech10 napisał(a):
bo jej nie przypisałem wartosci a jej adres to bedzie 24 w zapisie dziesietnym.
A skąd sobie wziąłeś taką akurat wartość 24 ? z przysłowiowego kapelusza ?
Programując w języku C NIKOGO tak na prawdę nie obchodzą fizyczne adresy komórek pamięci w których są zmienne, za to ja w książce tłumaczę to w oparciu o takie przykładowe adresy żeby lepiej to zrozumieć. W książkach do programowania w C na PC - nigdy nie spotkasz takiego podejścia że ktoś będzie mówił ci że np jakaś tam zmienna "G" leży sobie pod adresem 0x0045 - bo tam pamięci RAM masz od groma i w ogóle takie podejście jest niepotrzene.
leech10 napisał(a):
A gdyby tak umiescic dodatkową zmienną w innej funkcji, załózmy ze mam cos oprócz main. Zdefiniowac zmienna i nie przypisac jej wartosci. Pobrac wartosc scanf identyczna jak dla zmiennej globalnej czyli 10. Jaka wartosc i jaki adres bedzie miala?
No to już pewnie jak sam się domyślasz jest TOTALNYM nieporozumieniem.
jeszcze raz - definiujesz jakąś zmienną globalną np "a" (będzie zainicjalizowana ZEREM)
teraz pobierasz do niej wartość za pomocą scanf() np ze strumienia klawiatury komputerowej
to panie kochany ona będzie miała taką wartość jaki klawisz wcisnąłeś na klawiaturze - kod znaku ASCII a nie jakieś tam 10 co ty wymyślasz itp
..... Chyba że scanf() nie odbierze żadnego znaku to wartość zmiennej "a" zostanie nie zmieniona i pozostanie = 0
leech10 napisał(a):
Na dodatek nie wiem dokladnie jak dziala printf[ choc pewenie rozjasni mi sie dowiem jak dziala scanf.]
Ja bym na twoim miejscu zaczął od tego aby się dowiedzieć jak te funkcje działają a nie czytać 300 stron książki gdzie wciąż masz przykłady tylko na tych funkcjach i wciąż nie wiesz do czego one są
ale ok scanf() już ci chyba wyjaśniłem - pobiera dane ze strumienia WEjściowego
a printf() - wysyła dane na strumień WYjściowy
rozumiesz ? w C na PC posługujesz się pojęciem tzw strumieni we/wy. Co może być strumieniem WYjściowym ? jak myślisz ? no to podpowiadam. Może to być np: monitor, drukarka, dysk twardy itp
zakładając więc że strumieniem wyjściowym będzie monitor to printf spowoduje ci wyświetlenie tego co ma w argumentach na monitorze
no nie można bez tak mega podstawowej wiedzy próbować uczyć się C ale pewnie czytając tą książkę w ogóle nie próbujesz wykonywać ćwiczeń na PC i pewnie stąd twój problem - bo gdybyś sobie zainstalował jakiś kompilator i zaczął bawić się nawet w konsoli to już byś to poczuł dużo wcześniej....
Za to jak wiesz w mikrokontrolerach jesteśmy DUŻO bliżej sprzętu - wprawdzie i tu można posługiwać się strumieniami ale najpierw, .... najpierw panie kochany to trzeba te strumienie samemu zbudować, zmajstrować i jeszcze je zdefiniować jako strumienie
...
leech10 napisał(a):
ak ona wyswietla wartosc( w sensie wartosci zmiennych, ich adresy, co tak faktycznie widze na ekranie wpisujac ta liczbe 10)?
jeśli dasz zmiennej "a" wartość = 10 i wyświetlisz ją za pomocą printf() to czego innego można się spodziewać niż jej wartości czyli liczby 10?
Tobie się mylą tutaj niestety wskaźniki - o których może jeszcze nie doczytałeś ... i stąd twój problem z tymi adresami dlatego jeszcze raz z uporem maniaka
proponuję ci przeczytać rozdział o wskaźnikach w Bluebooku
reasumując:
scanf( "%d" , &a);
spowoduje wczytanie kodu klawisza do zmiennej "a" dlatego że jako argument podałeś WSKAŹNIK do swojej zmiennej "a" czyli jej adres rozumiesz ? dokonałeś tego za pomocą operatora wyłuskiwania adresu &.
natomiast:
printf("&d" , a);
wyświetli ci zawartość zmiennej "a", oczywiście gdybyś napisał
printf("&d" , &a);
to efekt byłby ten sam ....
ale jeśli cię to dziwi - to jak mówię - musisz poczytać o wskaźnikach ok ?