2017-09-16 1 views
0
gegossenen Typ

In C-Programmierung ist, was tut die folgende Initialisierung bedeutet,c Zeiger Initialisierung auf eine Reihe wqhich

char *ptr = (char *) 100; 

Ist es bedeutet, dass wir einen Zeiger namens ptr auf einen anderen Zeiger auf am Ort 100 initialisiert haben, die ist ein Zeiger selbst. Also, im Wesentlichen 100 ist auch Zeiger und wir haben den Zeiger auf einen Zeiger gesetzt.

+1

'100' selbst ist eine Konstante' int' Wert, ist es keine besondere Bedeutung haben. Es ist der * Ausdruck * '(char *) 100', der ein Zeiger auf die Adresse' 100' ist. –

Antwort

1

Sie sind vorbei denken. Es bedeutet ptr ist ein Zeiger auf Char, und es zeigt auf Adresse 100. Es könnte irgendetwas (oder nichts) an Adresse 100 sein; Es ist implementationsdefiniert, was dieser Code tun wird, wenn Sie versuchen, diesen Zeiger zu dereferenzieren.

Die meisten Architekturen mit einer MMU reservieren die Nullseite und stellen sicher, dass dort kein Speicher abgebildet werden kann. Dies bedeutet, dass der Versuch, eine Adresse zu lesen oder zu schreiben, die kleiner als die Seitengröße ist (normalerweise 4 KiB, also 0x1000), zu einem Seitenfehler und einem SIGSEGV unter Linux führt. Der Zweck davon ist, eine zufällige NULL-Zeigerdereferenz abzufangen.

+0

Danke. Ich habe das genauer gemacht. –

0

Dieser Ausdruck kann für Zeiger verwendet werden, die auf die bestimmte Adresse im Speicher zeigen. Nicht (fast) in den gehosteten Umgebungen verwendet, aber häufig in Embedded-Programmierung verwendet. Beispiele:

#define GPIOA    ((GPIO_TypeDef *) GPIOA_BASE) 
#define GPIOB    ((GPIO_TypeDef *) GPIOB_BASE) 
#define GPIOC    ((GPIO_TypeDef *) GPIOC_BASE) 
#define GPIOD    ((GPIO_TypeDef *) GPIOD_BASE) 
#define GPIOE    ((GPIO_TypeDef *) GPIOE_BASE) 

wo:

#define GPIOA_BASE   (0x40010000 + 0x0800) 
#define GPIOB_BASE   (0x40010000 + 0x0C00) 
#define GPIOC_BASE   (0x40010000 + 0x1000) 
#define GPIOD_BASE   (0x40010000 + 0x1400) 
#define GPIOE_BASE   (0x40010000 + 0x1800)