2016-05-15 8 views
8

Ich frage mich, ob es eine Möglichkeit gibt, ein Array von Zeigern zu machen, die auf die erste Spalte jeder Zeile in einem mehrdimensionalen Array von Ganzzahlen zeigen. Als Beispiel schauen Sie bitte auf den folgenden Code:Arrays von Zeigern, die auf Arrays von Ganzzahlen zeigen

#include <stdio.h> 

int day_of_year(int year, int month, int day); 

main() 
{ 
    printf("Day of year = %d\n", day_of_year(2016, 2, 1)); 
    return 0; 
} 

static int daytab[2][13] = { 
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

int day_of_year(int year, int month, int day) 
{ 
    int leap; 
    int *nlptr = &daytab[0][0]; 
    int *lpptr = &daytab[1][0]; 
    int *nlend = nlptr + month; 
    int *lpend = lpptr + month; 

    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0; 
    if (leap) 
     for (; lpptr < lpend; lpptr++) 
      day += *lpptr; 
    else 
     for (; nlptr < nlend; nlptr++) 
      day += *nlptr; 
    return day; 
} 

Wenn ich so schreibe unten:

int *p[2]; 
*p[0] = daytab[0][0]; 
*p[1] = daytab[1][0]; 

ich einen Fehler wie diese:

Error: Array must have at least one element 
Error: Variable 'p' is initialized more than once 
Error: { expected 
Error: Variable 'p' is initialized more than once 
Error: { expected 
***5 errors in Compile*** 

habe ich es wie dies:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

Ich bekomme immer noch die gleicher Fehler

Ich weiß, dass wir ein Array von Zeigern auf Zeichenketten, wie in der folgenden machen:

char *str[] = { 
    "One", "Two", "Three", 
    "Four", "Five", "Six", 
    "Seven", "Eight", "Nine" 
} 

Wie tun wir das für Arrays von ganzen Zahlen?

+0

"* Es funktioniert nicht *" ist das mehr oder weniger wert Fehlerbericht eine geben kann. Bitte präzisieren Sie den Fehler, die Warnung, die Fehlfunktion, die Sie erhalten, beobachten Sie! – alk

+2

Erstes Beispiel: große Chance, Segmentierungsfehler durch Dereferenzierung eines ungültigen Zeigers zu verursachen. Zweites Beispiel: Würden Sie erklären, was Sie mit "funktioniert nicht" meinen? – MikeCAT

+1

Der Code wie gezeigt (mit dem 2. Ansatz) sieht gut aus. – alk

Antwort

2

Code sollte als Charme arbeiten:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

printf("%d \n", p[0][2]); // shows: 28 
printf("%d \n", p[1][2]); // shows: 29 

Dies funktioniert auch:

int *p[2] = { &daytab[0][0],&daytab[1][0] }; 
+0

Der ehemalige Code, der kompiliert wird, gibt mir die Fehler, die ich oben erwähnte, obwohl ich denke, dass es nicht sollte. Aber letzteres funktioniert für mich, und es hat das Programm kompakter gemacht, was die Notwendigkeit für Wenn-sonst beseitigt. Vielen Dank. –

+0

Der letztere Code funktioniert, wenn ich es als cpp kompiliere. Aber wenn ich es als c kompiliere, bekomme ich den Fehler 'Illegale Initialisierung in der Funktion day_of_year' an der Zeile' int * pe [2] = {p [0] + Monat, p [1] + Monat}; '. –

+1

Wie bereits von Alk erwähnt, bitte aktualisieren Sie Ihren Compiler so schnell wie möglich! Es war in den 90er Jahren veraltet und es wird Ihnen sicherlich Kopfschmerzen bereiten. – tomekpe

1

Wenn es um die Definition von daytab ändert wie das dritte Beispiel gehen Sie dies nutzen gefallen könnten:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

statt.

oder das Ende des Arrays zu bleiben speichern und markieren Sie einen Wächter mit:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    NULL 
}; 

Oder^2 auch Sparer bleiben Markierung auch die innere Anordnung endet:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    NULL 
}; 

Bitte beachten dass die hier verwendeten Verbindungen ((Type){Initialiser}) nur ab C99 verfügbar sind.

1

Verwendung wie unten

int *p[2]; p[0] = daytab[0]; p[1] = daytab[1];