2016-05-20 16 views
1

Ich versuche das folgende Programm zu verstehen. Insbesondere die Definition von cur_name und das Inkrementieren des Zeigers für cur_age in der printf-Anweisung.Inkrementieren von Zeigern in C-Arrays

*(cur_age + i) muss jede der Ganzzahlen im Array indizieren, aber ich hätte erwartet, dass dies auf aufeinanderfolgende Adressen im Speicher zeigt und nicht die nächste Ganzzahl ints sind 4 Bytes? das heißt, warum nicht die i + 4

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int ages[] = {23, 43, 12, 89}; 
    char *names[] = {"Anne", "Kay", "Joe", "Pete"}; 
    int count = sizeof(ages)/sizeof(int); 
    int *cur_age = ages; 
    char **cur_name = names; 

    for (int i = 0; i < count; i++) { 
     printf("%s is %d years old.\n", *(cur_name + i), *(cur_age + i)); 
    } 

    return 0; 
} 

Antwort

6

Dieses einfach ist, wie der Zeiger arithmetics in C. Inkrementieren des Zeigers definiert ist, immer in Einheiten zu sein Inkrementierung betrachtet, wobei eine Einheit der sizeof() des Typs wird hingewiesen auf.

Seitennotiz - während int sind gemeinsam 4 Bytes in der Größe, ist dies nicht in Stein gemeißelt. Sie könnten auch kleiner (2 Bytes) oder länger (wirklich nicht begrenzt) sein.

+0

Also wenn man einen Zeiger inkrementiert, berücksichtigt er den Typ, großartig! Was das Zeichenarray betrifft, so verstehe ich, dass dies ein Zeiger auf ein Array von Zeigern ist, aber warum das **. – CatsLoveJazz

+0

@CatsLoveJazz, nicht wirklich. Es ist ein Array von Zeigern (kein Zeiger auf ein solches Array). Jedes Element dieses Arrays ist ein Zeiger auf 'char *' mit einer Größe von 'char *' size (zum Beispiel 8 Bytes). Arrays können zu den Zeigern "zerfallen" (tatsächlich tun sie es fast immer). Wenn Sie also "char ** cur_name = names" sagen, wird "names" * in den Zeiger auf den Zeiger auf char umgewandelt. – SergeyA

+0

Ich werde das verdauen müssen, danke. Ich habe mich auf die Variable 'cur_name' bezogen. – CatsLoveJazz