Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Char i pointeri ;)

[es] :: C programiranje :: Char i pointeri ;)

[ Pregleda: 848 | Odgovora: 8 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Yu Raider
Ivan Djordjevic
Bgd, SCG

Član broj: 40731
Poruke: 255
*.smin.sezampro.yu.



Profil

icon Char i pointeri ;)01.05.2006. u 21:00

Jako sam radoznao i ovo me baš zanima :

Ovaj kod:

Code:


#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{

char a = 'a';
char* b = &a;
cout << *b << endl;



Vraća rezultat "a".

E sad - onako kako sam ja naučio stringovi su zapravo skupovi slova koji imaju početnu adresu i na kraju znak "\0" koji određuje kraj stringa. Da li compiler sam ubaci taj znak na kraju ??? Ili sam ja potpuno pogrešno razumeo stringove...

Pozdrav
SLIder.
01.05.2006. u 21:00 

del-boy
Bojan Delić
Novi Sad

Član broj: 9330
Poruke: 846
*.67.eunet.yu.

ICQ: 77174165
Sajt: www.delic.in.rs


Profil

icon Re: Char i pointeri ;)01.05.2006. u 22:11
Ti ovde uopšte nemaš string, nego običan karakter!

Prvo si postavio da ti u promenljivoj a bude slovo a!
U sledećem redu deklatišeš pokazivač koji pokazuje na adresu promenljive a! Samim tim kada si ispisao na ekran *b mora da ispiše ono što se nalazi u promenljivoj a!
I ja blog za trku imam...
01.05.2006. u 22:11 

lowlife
Adam Stanojević
Developer, HSL Srbija
Kragujevac

Član broj: 83604
Poruke: 14
213.137.99.*



Profil

icon Re: Char i pointeri ;)01.05.2006. u 22:22
Pozdrav!

Ti u stvari stampas nulti byte(prvi znak) i nemas string. string bi 'uhvatio' sa b a ne sa *b. Ali opet stringa nema i poceo bi da divlja po memoriji dok ne pukne ili ne naidje na '\0'. b si namestio na char* i to je u redu ali si mu dao samo 1 byte bez kraja te ne moze da bude string - samo je pokazivac na znak.
01.05.2006. u 22:22 

z@re
Zarko Bulatovic
Split, Spinut

Član broj: 29849
Poruke: 414
*.cmu.carnet.hr.

Sajt: www.freebsd.org


Profil

icon Re: Char i pointeri ;)02.05.2006. u 03:40
"string" je niz znakova koji na svom kraju ima jos jedan dodatni znak, terminacijski, '\0'. Zadnji znak mora postojat, jer sve funkcije u C-u koje barataju sa nekakvim stringovima, to jest nizovima znakova, primaju pointer na pocetnu adresu tog niza. To je pocetna adresa, a kraj niza oznacava upravo taj terminacijski znak.

Ti ovdje uopce nemas string, nego si deklarirao jedan znak i inicijalizirao ga agregatno, pa si samo u jedan pointer tipa char, strpao memorijsku adresu gdje je lociran taj tvoj znak. Nakon toga ispisujes taj znak, ali preko pointera koji pokazuje na adresnu lokaciju.

Prakticki, (char *) ne mora uopce da pokazuje na nekakva slova ili neke nizove. U programiranju niskog nivoa se koristi upravo radi mogucnosi pokazivanja na 1 byte duzine.

Sta se tice tvog pitanja : ti kad agregatno inicijaliziras "string" u C-u, dakle char *x = "nesto"; ili char[] x = "nesto"; kompajler se sam pobrine da alocira dovoljno mjesta za tvoja slovca, kao i zadnje mjesto za term. znak. Kad ides rucno radit, trebas dodatno alocirat taj jedan znak, bas na primjeru za "nesto" :

Code:

char *x = (char *)malloc((sizeof(char) * 5) + 1);
strcpy(x, "nesto");
*(x + 5) = "\0";



[12:33am] <alek> deca od 3-5 godina prvi spoznaju ljubav bozju :)


Q: HSP56 Micromodem nece da radi kompjuter ga prepozna a kad treba da se konektujem nece ne daje ni znaka zivota. u cemu je problem.

A: Crko mozda od grmljavine mozda od spanaca. Uglavnom baci ga u WC solju jako povuci vodu. Skupi 5e i uzmi drugi i ne postuj temu na pogresno mesto.
02.05.2006. u 03:40 

Yu Raider
Ivan Djordjevic
Bgd, SCG

Član broj: 40731
Poruke: 255
..njuel-bg.customer.sbb.co.yu.



Profil

icon Re: Char i pointeri ;)02.05.2006. u 11:52
@lowlife
U tome je baš i poenta! Ako pointujem na adresu slova a, treba da mi se vrati sve do prvog null chara! Doduše tek sam sad shvatio da je char zapravo 1 bajt. Ima li neko neki kod koji bi to uradio?
SLIder.
02.05.2006. u 11:52 

kurt.hectic
Kurt Hectic

Član broj: 66049
Poruke: 25
*.etf.bg.ac.yu.



Profil

icon Re: Char i pointeri ;)02.05.2006. u 14:23
Ako hoces da se deo memorije pocev od b ispise kao ASCIIZ, onda
treba da kazes sta mislis:
Code:

 cout << b << endl;

umesto
Code:

 cout << *b << endl;


Razlika sto je prvi izraz tipa char* pa ga operator << ispisuje kao char* (za koji vazi ASCIIZ pravilo).
Treba da dobijes neko djubre, koje pocinje znakom 'a'.

Ako ispisujes *b, posto je tip izraza *b jednak char, operator << ga ispisuje kao char.
02.05.2006. u 14:23 

Yu Raider
Ivan Djordjevic
Bgd, SCG

Član broj: 40731
Poruke: 255
..njuel-bg.customer.sbb.co.yu.



Profil

icon Re: Char i pointeri ;)02.05.2006. u 17:53
E, to mi je trebalo. Hvala! A da li mogu da odredim na kojoj adresi da kompajler strpa slova? Mozda preko inline ASM?
SLIder.
02.05.2006. u 17:53 

z@re
Zarko Bulatovic
Split, Spinut

Član broj: 29849
Poruke: 414
*.cmu.carnet.hr.

Sajt: www.freebsd.org


Profil

icon Re: Char i pointeri ;)03.05.2006. u 00:02
Hmm...sad mi pada na pamet jedino preko offseta od neke adrese.

Code:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char a = 'x';
    char *m = &a;
    *(m + 13) = 't';
    
    for(int i = 0; i < 14; i++) 
        printf("%x, %c\n", m, *(m + i)); 
    system("PAUSE"); return EXIT_SUCCESS;    
}


Znaci, 13 bajtova od pocetne adrese gdje smo strpali znak 'x', stavljamo znak 't'. Medjutim, ovaj kod radi, ali to memorijsko mjesto nije alocirano, nego smo samo nesto tek tako zapisali tamo...Moze se desit da prilikom daljnjeg izvrsavanja koda nesto pregazi to mjesto.

[Ovu poruku je menjao z@re dana 03.05.2006. u 01:02 GMT+1]
[12:33am] <alek> deca od 3-5 godina prvi spoznaju ljubav bozju :)


Q: HSP56 Micromodem nece da radi kompjuter ga prepozna a kad treba da se konektujem nece ne daje ni znaka zivota. u cemu je problem.

A: Crko mozda od grmljavine mozda od spanaca. Uglavnom baci ga u WC solju jako povuci vodu. Skupi 5e i uzmi drugi i ne postuj temu na pogresno mesto.
03.05.2006. u 00:02 

tosa

Član broj: 1811
Poruke: 1265
222.67.154.*



Profil

icon Re: Char i pointeri ;)03.05.2006. u 11:45
Da dodam, string predstavlja niz karaktera ili deo teksta i način na koji je on zapisan je stvar konvencije.
Da, u C jeziku su najčešći stringovi terminisani nulom, ali to ne mora biti tako. Može se držati i
kao "pascal string" koji na početku ima zapisanu dužinu (broj karaktera) koja opet može biti zapisana
različitim brojem bajtova.

Dakle, sve zavisi od konvencije.

Soylent green: over 6 billion served!
03.05.2006. u 11:45 

[es] :: C programiranje :: Char i pointeri ;)

[ Pregleda: 848 | Odgovora: 8 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.