2016-05-09 3 views
-5

Я попытался оглянуться, но не смог найти ответ для этого. Я нашел что-то объясняющее, когда мы используем двойную звездочку **, однако я не уверен, применимо ли это к моему делу.Значение «звездочка типа звездочка» в C: * (volatile int *) foo

я наткнулся встраиваемые системы кода, который выглядит немного чуждо мне:

port0 = *(volatile int *)(0x1C002100) 

, что эта операция делает то, что он читает порт GPIO, чей адрес 0x1C002100. Однако какова сделка со всеми этими звездочками?

Я написал бы это что-то вроде:

port0 = *0x1C002100 

Они делают некоторый тип отливки типа указателя и, следовательно, мы используем 2 звездочки? Это было бы моим лучшим предположением. Спасибо за помощь !

+1

Возьмите книгу на C !!!!! –

+0

Если этот код действительно использует стандартные целочисленные типы типа 'int', это действительно плохой код и говорит что-то (не положительное) о качестве кода. Правильно использовать фиксированные типы ширины, например. 'Uint16_'. – Olaf

ответ

2

Посмотрите на выражение, оно сначала преобразует целочисленную константу в указатель, а затем отдает предпочтение этому указателю, который даст целое число. Это, по существу, такой же, как:

int *p = (volatile int *)(0x1C002100); 
int n = *p; 
port0 = n; 

Первый * обозначает тип указателя, второй оператор разыменования.

Однако вторая строка недействительна C-кодом, поскольку вы не можете разыменовать целое число.

port0 = *0x1C002100; 
Смежные вопросы