Forum: PC-Programmierung charr-array pointer Problem (Anfänger)


von Joe M. (jumper)


Lesenswert?

Hallo,
ich hab Verständnisprobleme mit "char-arrays und pointer"
Wäre klasse wenn mir jemand meine Fragen (siehe Kommentare )beantworten 
könnte.(Als Entwicklungsumgebung verwende ich Codeblocks und den 
dazugehörigen Standartcompiler )

Grüße Jumper
1
int main()
2
{
3
4
    char lable [] ="single\0";  //ist hier nun "single" der Inhalt von lable??? 
5
    char lable10 [10]="manfred";
6
    char *lablptr;
7
    lablptr=lable;
8
    printf("%s \n", (lablptr)); // weshalb muss ich hier nicht dereferenzieren wenn ich single als ausgabe will?
9
    printf("%s ", lablptr[1]);// weshalb stürtzt hier mein Programm ab?
10
11
12
    return 0;
13
}

von Pointer (Gast)


Lesenswert?

Mahlzeit,

Joe M. schrieb:
1
char lable [] ="single\0";  //ist hier nun "single" der Inhalt von lable???

ja (plus einer 0x00 am Ende)

Joe M. schrieb:
1
 printf("%s \n", (lablptr)); // weshalb muss ich hier nicht dereferenzieren wenn ich single als ausgabe will?

weil printf einen Pointer braucht (den du in der Zeilen vorher erzeugt 
und zugewiesen hast

Joe M. schrieb:
1
 printf("%s ", lablptr[1]);// weshalb stürtzt hier mein Programm ab?

weil lablptr[1] ein Pointer und kein Array ist! lablptr+1 wäre besser 
und sollte gehen.

von Karl H. (kbuchegg)


Lesenswert?

Pointer schrieb:

> weil lablptr[1] ein Pointer

fast

lablptr[1] ist ein einzelner Character und als solcher weder Pointer 
noch Array.

> und kein Array ist! lablptr+1 wäre besser
> und sollte gehen.

von Pointer (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> fast
>
> lablptr[1] ist ein einzelner Character und als solcher weder Pointer
> noch Array.
>
naja, auch nicht ganz...:
lablptr ist ein Pointer auf lable

lablptr[1] ist eigentlich gar nichts, da lablptr auch kein Array mit 
Pointern ist.

Mich wundert es, dass der Compiler an der Stelle nicht mal meckert...

von Karl H. (kbuchegg)


Lesenswert?

Pointer schrieb:
> Karl Heinz Buchegger schrieb:
>> fast
>>
>> lablptr[1] ist ein einzelner Character und als solcher weder Pointer
>> noch Array.
>>
> naja, auch nicht ganz...:

doch. das ist er.

> lablptr ist ein Pointer auf lable

davon ist nicht die Rede.

>
> lablptr[1]

davon ist die Rede

> ist eigentlich gar nichts, da lablptr auch kein Array mit
> Pointern ist.

sagt ja auch keiner

   lablptr[1]   <==>   *( lablptr + 1 );

zum Inhalt von lablptr 1 dazugezählt und dann den Wert von dieser so 
erhaltenen Adresse geholt. Und dieser WErt ist ... ein Character.
Nämlich derselbe, der auch mit
1
    char lable [] ="single\0";  //ist hier nun "single" der Inhalt von lable??? 
2
    char *lablptr;
3
    lablptr=lable;

lable[1] erhalten wird.

> Mich wundert es, dass der Compiler an der Stelle nicht mal meckert...

Warum sollte er. Es geht alles mit rechten Dingen zu. Das einzige was 
nicht stimmt ist der %s in der Format-Liste. Der müsste ein %c sein. 
Aber dazu ist der Compiler nicht verpflichtet das zu testen.

von Joe M. (jumper)


Lesenswert?

Karl Heinz Buchegger schrieb:
> lablptr[1] ist ein einzelner Character und als solcher weder Pointer
> noch Array.


aber weshalb bekomme ich dann mit
1
char lable [] ="single\0"; 
2
char *lablptr;
3
lablptr=lable;
4
printf("%c ", lablptr[1]);//s in c geändert!!!

als Ausgabe "i" wenn es angeblich kein Array ist...??

Grüße jumper

von Karl H. (kbuchegg)


Lesenswert?

Joe M. schrieb:
> Karl Heinz Buchegger schrieb:
>> lablptr[1] ist ein einzelner Character und als solcher weder Pointer
>> noch Array.
>
>
> aber weshalb bekomme ich dann mit
>
1
char lable [] ="single\0";
2
> char *lablptr;
3
> lablptr=lable;
4
> printf("%c ", lablptr[1]);//s in c geändert!!!
>
> als Ausgabe "i" wenn es angeblich kein Array ist...??


weil

    lablptr[1]  dasselbe ist wie  *(lablptr + 1)

(so ist in C die Indexoperation definiert. Eine []-Indexoperation hat 
nichts mit einem Array per se zu tun! Sie ist definiert in Form von 
Pointer-Arithmetik!)


   lable
   +---+---+---+---+---+---+---+
   | s | i | n | g | l | e | \0|
   +---+---+---+---+---+---+---+
     ^
     |
     |
     |      lablptr
     |      +----------+
     +------------o    |
            +----------+


    lablptr                    Wo zeigt lablptr hin?
    lablptr + 1                dort das nachste Element im Speicher
   *(lablptr + 1)              und von dort den Wert geholt

'und von dort den Wert geholt' .... und das ist nun mal das 'i'

Der Datentyp des Ausducks *(lablptr+1) ist nun mal 'char'. lablptr[1] 
ist nur eine andere Schreibweise für diesen Ausdruck. Daher ist auch der 
Datentyp in dieser Schreibweise ein 'char'.

Achtung:
Ich spreche nicht von lablptr. lablptr ist selbstverständlich ein 
char-Pointer. Aber der Ausdruck lablptr[1] ergibt einen char. Genauso 
wie *lablptr einen char ergibt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.