如果我创建一个变量说:
int a[10];
我正在创建一个变量并使用上述变量的地址空间来存储值。那么如何识别上述变量的地址空间呢??
如果我创建一个变量说:
int a[10];
我正在创建一个变量并使用上述变量的地址空间来存储值。那么如何识别上述变量的地址空间呢??
如果要打印变量的地址,请执行
int a[10];
int i;
int *p = &i;
printf("Address of a : %p \n", (void *)a);
printf("Address of i : %p \n", (void *)&i);
//to update i using pointer do
*p = 100; //or even p[0] = 100;
//a is array which is actually a pointer so you can update its elements as
a[0] = 10; //for 1st elem
a[1] = 100; //for 2nd elem etc.
//you can do this too
p = a;
p[0] = 10;
p[1] = 100;
如果您的意思是获得实际的物理地址,那么它不容易获得。
数组的内存地址范围从地址 a[0] 到地址 a[9]。您可以使用 获取起始地址&a[0]
。
地址空间是指不同硬件组件(如 RAM、io 设备等)的地址范围。
Sachin - 如果您正在为没有虚拟内存的嵌入式系统编写代码,您可以编写物理地址位置。例如,如果您想编写一些 8 位长且地址为 0x123 的内存映射寄存器等,您可以这样做:
*((unsigned char*)0x123) = 45;
它将执行的操作是将值 45(十进制)写入物理地址 0x123。
的意思:
*((unsigned char*)0x123)
如下:
(unsigned char*)0x123 // cast value 0x123 to pointer to unsigned char
这意味着将 0x123 视为无符号 8 位值的地址
和整个东西:
*((unsigned char*)0x123) = 45;
将使用通过 (unsigned char*)0x123 获取的指针将值 45 写入地址 0x123。
一般来说(在嵌入式系统上):
// assuming:
// C - pointer to 8bit entity
// S - pointer to 16bit entity
// I - pointer to 32bit entity
*(C) = 8bit_val; // will write 8bit **value** to physical address pointed by C
*(S) = 16bit_val; // will write 16bit **value** to physical address pointed by S
*(I) = 32bit_val; // will write 32bit **value** to physical address pointed by I
这真的很简化,但这会做你想要的。如果您想将数组、结构或常规变量放在特定的物理地址,可以在嵌入式系统上完成(例如,您必须阅读有关 ARM 编译器上的分散加载)。Scater 文件将允许您将数组放置在您想要的任何位置,并且您将能够使用常规语法访问它,而无需显式使用指针。
但是,在 Windows 平台上,您将无法做到这一点,因为您不使用物理地址,而是使用所谓的虚拟内存,其中您有一些理论上是地址但与物理地址无关的值。它太宽泛了,无法解释。这是一个巨大的主题。
这是有关分散加载的一些信息