PORTB
可能未被定義爲int
這意味着當您將地址PORTB
時,您將不會得到int *
。如果你確定你是對的,那麼你可以使用int *
代替PORTB
,你可以使用轉換來告訴編譯器它不需要擔心。你可以施放它是這樣的:
ptr = (int*)&PORTB
去的PORTB
的定義,讓我們知道它是什麼類型。
編輯2:
我寫的,爲什麼你不應該用我上面的答案的解釋,並通過我身邊糾正它的時候我看到@ouah已經發佈一個正確的答案,所以我請你請使用它,而不是我的。有關爲什麼的解釋,請閱讀下面的我的編輯1。
編輯1:
我的假設是,你知道PORTB
是一個int
和你是從void*
鑄造它。感謝@ H2CO3指出它實際上是(*(volatile uint8_t *)(0x25))
,這基本上意味着PORTB
是volatile uint8_t
。
這種情況下,你應該永遠不要投它到int
!如果這個工作,這意味着你的機器可能是little endian,你不應該依賴這個。
爲了解釋得當,讓我們建立一個簡單的例子:
我們有這樣的記憶:
Address Value
0x02 7
0x03 11
注:7是十六進制0x07的和二進制00000111和11 0x0B中十六進制和00001011二進制
現在我們有兩個指針:
uint8_t* BytePointer;
int* IntPointer; // int is either 2 or 4 bytes, we will assume it is 2 bytes.
int Value16;
uint8_t Value8;
// Let's set both to point to our fake memory address
BytePointer = (uint8_t*) 0x02;
IntPointer = (int*) 0x02;
// Now let's see what value each holds?
Value8 = *BytePointer;
Value16 = *IntPointer;
// Value8 will contain 0x07
// Value16 will contain 0x0B07 on a Little Endian machine
// Value16 will contain 0x070B on a Big Endian Machine
這個例子說明當我們從指針讀取值時會發生什麼,寫什麼?讓我們保持相同的變量之前,寫一些值
*BytePointer = 5;
內存現在看起來是這樣的:
0x02 5
0x03 11
什麼的int
指針?
*IntPointer = 5;
由於一個int
是兩個字節,它會改變兩個字節:
// Little endian
0x02 5
0x03 0
// Big endian
0x02 0
0x03 5
所以如果你使用PORTB
爲int
,每次分配給它,你正在寫2個字節,一到時間地址PORTB
和一個後續。我希望以後的任何事情都不重要......你不應該這樣做,所以如果你真的想使用指針,你應該使用uint8_t*
。
但是,當我開始解釋這一切正確的@ouah已經發布了一個正確的答案。請參考它應該如何完成。
值得一提的是,這就是爲什麼聲明另一個指針是多餘的原因 - 直接賦值給'PORTB'將會工作得很好。 – 2013-07-14 21:59:31
@ H2CO3在這種情況下是的,但他可能希望將端口作爲參數傳遞給函數,並且他必須使用'volatile unsigned char *'作爲參數類型。 – ouah
@ouah嗯,你的答案肯定比我原來的帖子更正確,當我修好它的時候,你已經有了這個。我引用了你,我也會贊成你的答案。 – nonsensickle