charr-array pointer Problem (Anfänger)

#3041147
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
}
Gast #3041161
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.
#3041242
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.
#3041335
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren