2017-02-15 13 views
0

Ich habe diesen Code, der die kleinste Ganzzahl in einem Array finden soll. Ich lerne, wie man Zeiger in C benutzt, und mein Code wird nicht kompilieren, aber ich weiß nicht warum. Anstatt nur die Antwort, würde ich gerne wissen, warum ich falsch mache oder wie ist mein Denkprozess falsch.Wie Zeiger richtig in C verwenden?

Ich dachte, dass *p_min den Wert innerhalb der Adresse zurückgeben wird.

Die Fehler, die ich erhalten:

error: invalid type argument of ‘unary *’ (have ‘int’) 

Warning: return makes pointer from integer without a cast 

p außerhalb der Funktion als int * p erklärt wird;

Code:

int *find_smallest(int a[], int N) 
{ 
    int *p_min; 

    for (p = &a[0]; p < &a[N]; p++) 
    { 
     if (*p[1] < *p[0]) { 
      p_min = &p[1]; 
      return *p_min; 
     } else { 
      p_min = &p[0]; 
      return *p_min; 
     } 
    } 
} 
+1

Sie sind wieder ein 'int' aber Ihre Funktion will einen Zeiger auf' int' zurückzukehren, auch, was 'P'? –

+0

Sorry ist nur das ist ein längerer Code, aber p ist als int * p deklariert; –

+0

Sie sollten Ihren Code richtig formatieren (// prohackr112.tk/pcf). Die richtige Formatierung zieht Leute an und ermutigt sie, Ihnen zu helfen. –

Antwort

-4

Es gibt viele Probleme (und Orte zu verbessern) diesen Code. Es ist sehr verwirrend, also bin ich mir nicht ganz sicher, was Sie zu tun versuchen, aber ich werde auf einige Stellen hinweisen, an denen Sie anfangen sollten.

  • Nur eine Warnung, wenn Sie das Array ändern möchten, find_smallest(int a[], int N) nicht * tun, müssen Sie so etwas wie find_smallest(int (*a)[], int N);, die Sie dann wie (*a)[some_index] zugreifen würde.
  • Ihre Funktion sagt, es gibt eine int *, aber die beiden return s ich habe int Werte.
  • Wo ist deklariert?
  • Warum brauchen Sie &a[0] anstatt nur a[0], wenn Sie nur den kleinsten Wert im Array finden?
  • Sie versuchen weiterhin auf *a[some_index] zuzugreifen. Es sieht so aus, als wolltest du es wie gesagt weitergeben. Zugriff auf es als *a[some_index] führt zu allen Arten von Fehlern, müssen Sie etwas wie (*a)[some_index] schreiben. So erkennt C Zeiger.
  • Wenn Sie auf die eine oder andere Weise *p_min zurückgeben, sollten Sie die return s nicht in die if-Anweisungen einfügen, da dies den Compiler verlangsamen und Speicherplatz verschwenden würde.

* Wenn Sie es wie int a[] passieren, wird die Funktion nur eine lokale Kopie der Variablen haben, und nicht in der Lage sein, es zu ändern. Dies führt zu vielen verwirrenden Fehlern. Wenn Sie also Ihre Funktion zu etwas Größerem entwickeln möchten, sollten Sie dies berücksichtigen.

+2

'int a []' ist absolut äquivalent zu 'int * a' als Funktionsparameter, keine Kopie des betreffenden Arrays. Ich bin mir auch nicht sicher, ob "int (* a) []" gültig ist, IIRC, das sollte "int (* a) [*]" sein. – Quentin

+0

@Quentin gültig. https://github.com/aaronryank/rk-lang/blob/master/compute.c#L332 –

+0

JFYI: 'int a []' ist [im Grunde die gleiche Sache] (http://stackoverflow.com/a/ 1641963/223424) als 'int * a', nur eine andere Syntax für den Zugriff. – 9000

4

Nicht wirklich sicher, was Sie mit der Vergleichslogik machen. Der einfachste Ansatz besteht darin, mit dem ersten Element zu beginnen und dann den Rest sequentiell zu überprüfen, wobei der Index des kleineren beibehalten wird. Mein Code würde wie folgt sein:

int *find_smallest(int a[], int N) 
{ 
    /* Make sure the input is valid */ 
    if (a && N > 0) 
    { 
     int i, N_min = 0; 
     /* Check the rest of the elements */ 
     for (i = 1; i < N; i++) 
     { 
      /* If this one is lower, save the index */ 
      if (a[i] < a[N_min]) 
       N_min = i; 
     } 
     /* Return pointer to minimum */ 
     return a + N_min; 
    } 
    /* Return NULL to indicate an error */ 
    return NULL; 
} 
0
  • *p[1] < *p[0] sollte *(p+1) < *p oder p[1] < p[0] sein. Der Rückgabetyp sollte int sein.
  • Sie geben unbedingt nach einem Durchlauf der Schleife zurück.
  • Sie haben nie deklariert.
  • Beachten Sie, dass &a[i]a+i geschrieben werden kann.
  • Sie sollten p[0] (aka *p) und *p_min, nicht p[0] und p[1] vergleichen.
  • p[1] könnte sogar über das Ende des Arrays hinaus sein!
  • Sie initialisieren p_min nicht.
  • Es gibt keinen Grund int* p_min; anstelle von int min; zu haben.

Feste:

int find_smallest(int a[], int N) { 
    int min = a[0]; // Assumes a[] will have at least one element. 
    for (int* p=a; p<a+N; ++p) { 
     if (*p < min) min = *p; 
    } 

    return min; 
} 

Oder einfach:

int find_smallest(int a[], int N) { 
    int min = a[0]; // Assumes a[] will have at least one element. 
    for (int* p=a; N--; ++p) { 
     if (*p < min) min = *p; 
    } 

    return min; 
} 

Alternativ könnte man einen Index anstelle eines Zeigers verwenden.

int find_smallest(int a[], int N) { 
    int min = a[0]; // Assumes a[] will have at least one element. 
    for (int i=0; i<N; ++i) { 
     if (a[i] < min) min = a[i]; 
    } 

    return min; 
} 

Oder einfach:

int find_smallest(int a[], int N) { 
    int min = a[0]; // Assumes a[] will have at least one element. 
    for (int i=N; i--;) { 
     if (a[i] < min) min = a[i]; 
    } 

    return min; 
}