我對使用c風格指針訪問特定地址有點困惑。尋址指針的不同方式C/C++
我有一個32位芯片,我試着編程。我需要翻轉一些內容或任何內存。以下解決方案正常工作。
uint32 strbase = 0x00168380;
volatile uint32 *ram = (uint32*)0x03000000;
ram[(strbase+0x48)/4] = 0x10000000;
ram[(strbase+0x4c)/4] = 0x10000000;
ram[(strbase+0x50)/4] = 0x10000000;
ram[(strbase+0x54)/4] = 0x10000000;
ram[(strbase+0x58)/4] = 0x10000000;
ram[(strbase+0x5c)/4] = 0x10000000;
ram += (strbase+0x60)/4;
但是,我有點困惑。我試着寫了幾個不同的子程序,我認爲它們是等效的,但沒有奏效。以下方法只是有點作品。
uint32 strbase = 0x00168380;
volatile uint32 *ram = (uint32*)0x03000000;
*(uint32*)(0x03000000 + 0x001683c8) = 0x10000000;
*(uint32*)(0x03000000 + 0x001683CC) = 0x10000000;
*(uint32*)(0x03000000 + 0x001683D0) = 0x10000000;
*(uint32*)(0x03000000 + 0x001683D4) = 0x10000000;
*(uint32*)(0x03000000 + 0x001683D8) = 0x10000000;
*(uint32*)(0x03000000 + 0x001683DC) = 0x10000000;
ram += (strbase+0x60)/4;
以下方法根本不起作用。
uint32 strbase = 0x00168380;
volatile uint32 *ram = (uint32*)0x03000000;
ram += strbase+0x48;
*ram++ = 0x10000000;
*ram++ = 0x10000000;
*ram++ = 0x10000000;
*ram++ = 0x10000000;
*ram++ = 0x10000000;
*ram++ = 0x10000000;
我一直在這個燉一段時間。我認爲這可能是編譯器做了一些有點優化。希望你們中的一個能夠向我解釋什麼是錯誤的,或者指出我需要哪些資源來解決這個問題。
在你的第三個示例中,值'(strbase + 0x48)'需要除以四。 – rwong
在中間示例中,如果不將地址強制轉換爲uint32_t *,編譯器將生成警告。這是你「有點作品」的意思嗎? – sansuiso
uint32是我製作的typedef。我所擁有的是編譯器和我的代碼。 –