如果我创建变量,请说:
int a[10];
我正在创建一个变量,并使用上述变量的地址空间来存储值。那么如何识别上述变量的地址空间?
答案 0 :(得分:1)
如果要打印变量的地址,请执行
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;
如果您想获得实际的实际地址,则不易获得。
答案 1 :(得分:1)
数组的存储器地址范围从[0]的地址到[9]的地址。您可以使用&a[0]
获取起始地址。
Address space是指RAM,io设备等不同硬件组件的地址范围。
答案 2 :(得分:0)
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编译器上的分散加载)。 Sccater文件允许您将 a 数组放在您想要的任何位置,并且您可以使用常规语法访问它,而无需明确使用指针。
然而,在Windows平台上,您无法做到这一点,因为您没有使用物理地址,而是使用所谓的虚拟内存,其中您有一些理论上是地址的值,但它与物理地址无关。这太宽泛了,无法解释。这是一个很大的主题。
以下是有关scatter loading
的一些信息