• 8 odgovora
  • 3.042 pregleda
Char i pointeri ;) 01.05.2006. u 21:00 · pre 249 meseci #1
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
Potpis
SLIder.
Re: Char i pointeri ;) 01.05.2006. u 22:11 · pre 249 meseci #2
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!
Re: Char i pointeri ;) 01.05.2006. u 22:22 · pre 249 meseci #3
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.
Re: Char i pointeri ;) 02.05.2006. u 03:40 · pre 249 meseci #4
"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";


Potpis

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.
Re: Char i pointeri ;) 02.05.2006. u 11:52 · pre 249 meseci #5
@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?
Potpis
SLIder.
Re: Char i pointeri ;) 02.05.2006. u 14:23 · pre 249 meseci #6
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.
Re: Char i pointeri ;) 02.05.2006. u 17:53 · pre 249 meseci #7
E, to mi je trebalo. Hvala! A da li mogu da odredim na kojoj adresi da kompajler strpa slova? Mozda preko inline ASM?
Potpis
SLIder.
Re: Char i pointeri ;) 03.05.2006. u 00:02 · pre 249 meseci #8
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]
Potpis

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.
Re: Char i pointeri ;) 03.05.2006. u 11:45 · pre 249 meseci #9
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.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme