2016-06-08 15 views
0

Ich habe in letzter Zeit einen Code für die Programmierung in C studiert. Ich bin hier stecken geblieben, während ich mich mit zweidimensionalen Strings und Zeigern beschäftigt habe. Auch die Funktionen printf(), putchar() und puts() sind verwirrend! Bitte helfen Sie mir mit dem folgenden Ausschnitt aus:C Strings, Pointer, Puts

#include<stdio.h> 

int main() 
{ 
    char wer[3][4]= {"bag", "let", "bud"}; 
    char (*ptr)[4]=wer; 
    printf("%d %d %d\n",ptr, ptr+1, ptr+1); // points to bag, let and bud respectively 
    printf("%d %d %d\n",wer, wer+1, wer+1); // points to bag, let and bud respectively 

    printf("%d %d %d\n", (*ptr), (*ptr+1), (*ptr +2)); // points to b,a,g respectively 

    printf("%s\n",*(ptr+1)); //prints let 
    printf("%s\n", (ptr+1)); //prints let 
    printf("%s\n", (*ptr +1)); //prints ag 


    puts(*(ptr+1)); //prints let 
    //puts((ptr+1)); //gives error 
    puts((*ptr+1)); //prints ag 


    putchar(**(ptr+1));//prints l 
    putchar(*(*ptr +1));//prints a 

    return 0; 
} 

ich, warum *(ptr+1) tun wissen wollen und (ptr+1) arbeiten beide für printf während (ptr+1) für puts einen Fehler gibt. Auch ich weiß, dass putchar ein ganzzahliges Argument nimmt. Warum verwenden wir hier einen Doppelzeiger?

+0

Drucken Sie die Zeiger mit '% p' –

+0

Außerdem fordere ich Sie auf, die man-Seiten erneut zu lesen und überprüfen Sie die bereitgestellten Datentypen. :) –

+0

"gibt einen Fehler": Welcher Fehler? –

Antwort

0

Ihre ptr Variable ist vom Typ char (*)[4] (ein Zeiger auf char Array). Der Prototyp von puts ist:

int puts(const char *s); 

So, wie der Compiler wahrscheinlich sagt, puts einen Zeiger auf char erwartet, aber sie geben ein Argument vom Typ char (*)[4].

Ich möchte wissen, warum * (ptr + 1) und (ptr + 1) beide für printf arbeiten, während (ptr + 1) einen Fehler für puts gibt.

Die Argumenttypen sind nicht auf den Anruf zu printf geprüft (wahrscheinlich, weil printf variadische Argumente übernimmt). Fügen Sie -Wall in Ihrem CFLAGS hinzu, um weitere Warnungen hinzuzufügen, und Ihr Compiler sollte eine Warnung dazu ausgeben.

Auch ich weiß, dass putchar ein ganzzahliges Argument nimmt. Warum verwenden wir hier einen Doppelzeiger?

Sie dereferenzieren ptr zweimal char (Sie können auch (*ptr)[1] tun können) zu erhalten. Diese char wird implizit in int umgewandelt, wenn Sie Putchar aufrufen.

+3

'char * [4]' ist ein Array von 4 Zeichen Zeiger, 'char (*) [4]' ist ein Zeiger auf ein Array von 4 Zeichen. – user694733

+1

'ptr' ist kein Array von Zeigern. – 2501

+0

Das half und brachte Klarheit. Vielen Dank. –